【问题标题】:how to use function(1)(2) in javascript? and how does it work?如何在javascript中使用函数(1)(2)?它是如何工作的?
【发布时间】:2009-11-21 23:13:44
【问题描述】:

我了解调用函数(1)但不了解函数(1)(2),它是如何工作的?

function(1)(2)(3)(4) 也可以吗?

【问题讨论】:

    标签: javascript function


    【解决方案1】:

    在这种情况下,您假设 function(1) 返回一个函数,而不是使用参数 2 调用这个新的匿名函数。

    看这个例子:

    function sum(a) {
        return function(b) {
            return a+b;
        }
    }
    
    // Usage:
    window.alert(sum(5)(3));         // shows 8
    
    var add2 = sum(2);
    window.alert(add2(5));           // shows 7
    window.alert(typeof(add2));      // shows 'function'
    

    这里我们创建了一个函数sum,它接受一个参数。在函数sum 中,我们创建了一个接受另一个参数的anonymous function。这个匿名函数作为执行sum的结果返回。

    请注意,这个匿名函数是我们称之为 closure 的一个很好的例子。闭包是一个保留创建它的上下文的函数。在这种情况下,它会将变量a 的值保留在其中,就像示例函数add2 一样。如果我们创建许多闭包,它们是独立的,如您所见:

    var add3 = sum(3);
    var add4 = sum(4);
    
    window.alert(add3(3)); // shows 6
    window.alert(add4(3)); // shows 7
    

    此外,如果您有类似命名的局部变量,它们就不会“混淆”:

    var a = "Hello, world";
    
    function multiply(a) {
        return function(b) {
            return a * b;
        }
    }
    
    window.alert(multiply(6)(7)); // shows 42
    
    var twoTimes = multiply(2);
    window.alert(typeof(twoTimes));
    window.alert(twoTimes(5));
    

    因此,在调用sum(2)multiply(2) 之后,结果不是数字,也不是字符串,而是function。这是 functional languages 的一个特点——在这些语言中,函数可以作为参数传递并作为其他函数的结果返回。

    【讨论】:

      【解决方案2】:

      你有一个返回函数的函数:

      function f(n) {
        return function(x) {
          return n + x;
        };
      }
      

      当你调用 f(1) 时,你会得到一个对函数的引用。您可以将引用存储在变量中并调用它:

      var fx = f(1);
      var result = fx(2);
      

      也可以直接调用:

      var result = f(1)(2);
      

      要得到一个返回函数的函数返回一个函数的函数,你只需要重复这个过程:

      function f(n) {
        return function(x) {
          return function(y) {
            return function(z) {
              return n + x + y + z;
            }
          }
        };
      }
      

      【讨论】:

      • 对否决票感到好奇?如果你不解释你不喜欢什么,那是毫无意义的......
      【解决方案3】:

      如果你的函数返回一个函数,你也可以调用它。

      x = f(1)(2)
      

      相当于:

      f2 = f(1)
      x = f2(2)
      

      【讨论】:

        【解决方案4】:

        括号表示函数的调用(你“调用”它)。如果你有

        <anything>()
        

        表示anything的值是一个可调用值。想象一下以下函数:

        function add(n1) {
            return function add_second(n2) { 
                return n1+n2
            }
        }
        

        然后,您可以将其调用为 add(1)(2),它等于 3。您自然可以随意扩展它。

        【讨论】:

        • 不需要为返回的函数命名,顺便说一句。 return function(n2) 也一样好,而且打字更少。
        • 我知道。我觉得最好不要通过使用匿名函数来混淆手头的问题。
        猜你喜欢
        • 1970-01-01
        • 2012-01-28
        • 2017-07-19
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 2022-11-30
        • 2018-02-10
        • 1970-01-01
        相关资源
        最近更新 更多