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

makeIncreaseByFunction(3)(10);

为清晰而更新 有人可以解释为什么 (3)(10) 是这样写的吗?我知道 10 是作为内部函数的参数提供的,但是为什么在语法上这样表示?如果我们有三个嵌套函数,参数是否总是按照 (3)(10)(20) 中的顺序编写?

4

3 回答 3

5

带中间变量:

var increaseBy3 = makeIncreaseByFunction(3);
var foo = increaseBy3(10);

没有中间变量:

var foo = makeIncreaseByFunction(3)(10);

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


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

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

( makeIncreaseByFunction(3) )(10)

这里发生的是makeIncreaseByFunction(3)首先被调用并返回⟪inner function⟫,然后我们调用⟪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 版——但除非您有 Lambda 演算的背景,否则这可能会让您感到困惑,而不是帮助您!

于 2013-07-31T23:21:36.663 回答
0

makeIncreaseByFunction(3)将返回function,因此使用 10 调用它的语法为makeIncreaseByFunction(3)(10).

这很容易理解,就好像你有一个函数foo(想象 makeIncreaseByFunction(3) 的返回就是这样一个函数,它们的评估相同),然后你会用 10 using 调用它foo(10)

至于 10 的值是如何“通过”的,这是错误的处理方式。

您必须意识到,在 Javascript 中,函数是一流的对象。您不是将值传递给内部函数,而是创建一个执行所需操作的函数,然后使用外部参数调用它。

这与在非函数式语言中使用变量在函数中添加相同,只是函数可以在运行时动态创建,并且可以设置其定义中的任何变量的值,从而影响其内部一致性。

闭包是指创建的函数是一个黑盒,它隐藏了用于初始化它的变量,尽管仍然使用该变量来增加调用它的值。

于 2013-07-31T23:23:44.453 回答
0

var increaseBy3 = makeIncreaseByFunction(3);与(忽略变量的本地存储)完全相同increaseByAmount

var increaseBy3 = function (numberToIncrease) {
    return numberToIncrease + 3;
};

所以当然现在您可以调用increaseBy3(10)并获取13. increaseBy3只是作为匿名函数引用,它返回它的第一个参数 plus 3

于 2013-07-31T23:24:14.843 回答