【问题标题】:Javascript function call like somefunction("Hi")("Hello")("How")Javascript 函数调用,例如 somefunction("Hi")("Hello")("How")
【发布时间】:2014-09-24 19:09:52
【问题描述】:

请看一下这段代码。我需要显示一条警报消息“mikä on elämän tarkoitus?”使用此代码

window["mikä"]("on")("elämän")("tarkoitus")("?"); 

我需要编写一个函数或一段代码,以便在我执行该代码时显示该警报消息。

我写了一个这样的函数:

window["mikä"] = function(str){
alert(str);
}

当我调用 window"mikä" 时有效,但如果我在控制台中添加更多类似下面的内容,我会看到类型错误。

 window["mikä"]("on")("Hello")("How"); 

我的问题是因为有多个功能标志,所以像下面这样调用是否有效?

window["mikä"]("on")("elämän")("tarkoitus")("?") 

【问题讨论】:

    标签: javascript function window


    【解决方案1】:

    要实现您正在寻找的功能,一种方法是编写一个返回函数的函数,该函数返回一个函数,正如其他提到的那样。如果事先知道函数的数量,那效果很好。另一种方法是使用称为currying 的函数式编程技术,即

    将采用多个参数(或参数元组)的函数的求值转换为对一系列函数进行求值的技术,每个函数都有一个参数(部分应用)。

    您可以像这样编写自己的咖喱函数:

    function curry(func, args_) {
        var self = this;
    
        self.args = args_ || [];
    
        return function() {
            var extended_args = [].concat(self.args).concat(Array.slice(arguments));
    
            if(extended_args.length >= func.length)
                return func.apply(this, extended_args);
    
            return new curry(func, extended_args);
        };
    }
    var funcName = "mikä";
    window[funcName] = curry(functionstr1, str2, str3, str4) {
        alert(funcName + ' ' + str1 + ' ' + str2 + ' ' + str3 + str4);    
    });
    window["mikä"]("on")("elämän")("tarkoitus")("?");
    

    如果您有兴趣了解更多关于 JS 中的柯里化/函数式编程的信息,这里有一些资源可以帮助您。

    http://kukuruku.co/hub/javascript/an-interesting-task-for-an-interview-currying-and-partial-applicationof-a-function http://tech.pro/tutorial/2011/functional-javascript-part-4-function-currying Reginald Braithwaite's talk in NDC Oslo

    【讨论】:

    • 在这一行显示错误 window[funcName] = curry(functionstr1, str2, str3, str4) {
    • 错误是什么?你在什么浏览器上运行它?从fiddle 可以看出,我已经在 Chrome 中工作了。您可以尝试改成window.mikä =
    • 解决了。在行 window[funcName] = curry(functionstr1, str2, str3, str4) { 需要在“str1”之前的“function”之后添加“(”,然后在Carly括号之后添加右括号“)”
    • 没关系。但是非常感谢您发送一些参考资料并为此提供帮助。
    • 不客气。函数式编程非常强大,它允许您将小块功能组合在一起,从而产生更具可读性/可维护性的代码。如果我的解决方案确实解决了您的问题,如果您能将其标记为答案,我将不胜感激。谢谢。
    【解决方案2】:

    您也希望返回值是一个函数,以便对返回值的额外调用将​​调用相同的函数。只需添加此

    window["mikä"] = function(str){
      alert(str);
      return window["mikä"];
    }
    

    编辑:误读了您的问题,这将发出多条警报消息。对不起。

    【讨论】:

      【解决方案3】:

      您可能想要嵌套函数调用

      window["mikä"] = function(s1){
          return function(s2) {
              return function(s3) {
                  alert(s1 + ' ' + s2 + ' ' + s3);
              }
          }
      }
      
      window["mikä"]("on")("elämän")("tarkoitus")("?");

      至于在函数内部获取函数名,实在没有什么好办法,应该避免。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-21
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 2016-07-18
        相关资源
        最近更新 更多