function()()不理解额外的括号。它是如何执行的?

时间:2017-05-31 16:10:05

标签: javascript function closures

    function times(x){
      return function(y){
        return function(z){
          return  x*y*z;
        }
      };
    }

有点混淆这究竟是如何起作用的?该函数如何知道下一个括号是内部返回函数的参数?

console.log(times(2)(5)(2))  // 20

5 个答案:

答案 0 :(得分:2)

此:

times(2)

执行函数times。但看看那个函数返回的是什么:

function times(x){
  return function(y){
    //...
  }
}

它返回一个函数。所以那个函数,作为times(2)的返回值,本身就可以执行:

times(2)(5)

该函数返回一个函数,该函数本身也被执行:

times(2)(5)(2)

基本上,在JavaScript中,函数就像任何其他函数一样。它可以作为参数传递,返回,设置为变量,或者只是内联执行而无需命名或以其他方式引用。

所以这个:

times(2)(5)

大致等同于此:

var func = times(2);
func(5);

但是不需要变量来存储该初始返回值,它只是在返回时执行它。

答案 1 :(得分:0)

当您编写times(2)(5)(2)时,您基本上正在执行((times(2))(5))(2),这意味着将评估times(2),这将返回一个函数,然后将使用{{1}来评估该函数等等。

一个更好的例子:

(5)

答案 2 :(得分:0)

这意味着第一个函数返回另一个函数,该函数又返回另一个函数。

与一个接一个地调用所有三个函数相同。

var func1 = times(2);
var func2 = func1(3);
var func3 = func2(4);

答案 3 :(得分:0)

一个接一个:

function times(x){
  return function first(y){
    return function second(z){
      return  x*y*z;
    }
  };
}

var progress=times(1);

进步现在是第一个指针,因为第一次被时间返回。 X绑定到它(看看Closures ......)

progress=progress(2);

进展现在排在第二位,第二位是由First返回。

progress=progress(3);//1*2*3

答案 4 :(得分:0)

这个概念叫做currying

所以它的作用是:

var result1 = times(2); //==> returns a function
var result2 = result1(5); //==> returns a function
var result3 = result2(5); //==> returns a product