闭包语法

jjj*_*jjj 4 javascript

function makeIncreaseByFunction(increaseByAmount) {
  return function (numberToIncrease) {
    return numberToIncrease + increaseByAmount;
  };
}

makeIncreaseByFunction(3)(10);
Run Code Online (Sandbox Code Playgroud)

为Clarity更新了 有人可以解释为什么(3)(10)的写法是这样的吗?我知道10是作为内部函数的参数提供的,但为什么语法上会这样注明?如果我们有三个嵌套函数,那么参数总是按照(3)(10)(20)中的顺序写出来吗?

Dao*_*Wen 5

带中间变量:

var increaseBy3 = makeIncreaseByFunction(3);
var foo = increaseBy3(10);
Run Code Online (Sandbox Code Playgroud)

没有中间变量:

var foo = makeIncreaseByFunction(3)(10);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,第一个invokation都将参数传递3makeIncreaseByFunction,结果它返回已经关闭的内部函数,increaseByAmount其值为3.无论是为返回的中间函数创建变量makeIncreaseByFunction,还是直接调用它,它都会做同样的事情.


你能解释一下var foo = makeIncreaseByFunction(3)(10)中的更多细节吗?10正在进入内在的功能?它只是在语法上与通常在Javascript中传递给我的参数不同. - ggg

makeIncreaseByFunction(3)返回一个函数,特别是里面定义的"内部函数" makeIncreaseByFunction.与所有函数一样,您可以使用function ( arguments )语法调用它.你可以这样写它,如果它对你更有意义:

( makeIncreaseByFunction(3) )(10)
Run Code Online (Sandbox Code Playgroud)

这里发生的事情是makeIncreaseByFunction(3)首先调用并返回«inner函数,然后我们调用?inner function?(10).

如果你手工评估这个(我认为这就是你在语法上的意思),你可以想到它会像这样一步一步地发生:

// Original invocation
var foo = makeIncreaseByFunction(3)(10);

// Substitute the definition of makeIncreaseByFunction
var foo = (function (increaseByAmount) {
  return function (numberToIncrease) {
    return numberToIncrease + increaseByAmount;
  };
})(3)(10);


// Apply the parameter 3
var foo = (function (numberToIncrease) {
  return numberToIncrease + 3;
})(10);


// Apply the parameter 10
var foo = 10 + 3;

// Final result
var foo = 13;
Run Code Online (Sandbox Code Playgroud)

注意:如果你想成为技术人员,我们在这里所做的只是两次Beta减少 - 但除非你有Lambda微积分的背景,否则你可能会对它有所帮助!