function makeIncreaseByFunction(increaseByAmount) {
return function (numberToIncrease) {
return numberToIncrease + increaseByAmount;
};
}
makeIncreaseByFunction(3)(10);
更新为清晰度
有人可以解释为什么(3)(10)是这样写的吗?我知道10是作为内部函数的参数提供的,但是为什么在语法上这样表示呢?如果我们有三个嵌套函数,参数是否总是按照(3)(10)(20)的顺序编写?
最佳答案
具有中间变量:
var increaseBy3 = makeIncreaseByFunction(3);
var foo = increaseBy3(10);
没有中间变量:
var foo = makeIncreaseByFunction(3)(10);
在这两种情况下,第一次调用都会将参数
3
传递给makeIncreaseByFunction
,结果是它返回已关闭increaseByAmount
且值为3
的内部函数。无论是为makeIncreaseByFunction
返回的中间函数创建一个变量,还是直接调用它,它都会做同样的事情。makeIncreaseByFunction(3)
返回一个函数,特别是在makeIncreaseByFunction
内部定义的“内部函数”。与所有函数一样,您可以使用function ( arguments )
语法来调用它。如果这样对您更有意义,则可以这样编写:( makeIncreaseByFunction(3) )(10)
这里发生的是首先调用
makeIncreaseByFunction(3)
并返回“内部函数”,然后我们调用⟪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;
注意:如果您想成为技术专家,我们在这里要做的只是两个Beta reductions,但除非您对Lambda微积分有一定的了解,否则可能会给您带来更多困惑,而不是对您有所帮助!