Javascript闭包中分配给变量的函数的附加参数

Additional arguments for functions assigned to variables in Javascript closures

本文关键字:函数 参数 变量 闭包 分配 Javascript      更新时间:2023-09-26

我正在阅读Eloquent JS并寻找关于这段代码的澄清:

function multiplier(factor) {
  return function(number) {
    return number * factor;
  }; 
}
var twice = multiplier(2); 
console.log(twice(5)); 
// → 10

我理解闭包概念,但我卡住的是twice(5)在最后一行被调用的方式。雄辩的JS说:

"在本例中,multiplier返回存储在twice变量中的冻结代码块。最后一行调用这个变量中的值,导致冻结的代码(return number * factor;)被激活。它仍然可以访问创建它的multiplier调用中的factor变量,此外,它还可以通过number形参访问解冻它时传递的实参5。

在解冻结时传递对参数5的"额外访问"是闭包的一个特性吗?当twice是一个变量时,这是如何工作的?

如果你在devtools中命名内部函数并检查它应该更有意义。

function multiplier(factor) {
  return function innerMultiplier(number) {
    return number * factor;
  }
}
当赋值给twice multiplier时,

被调用,返回内部函数因为javascript有第一类函数,它们可以被传递通过引用

赋值给变量
var twice = multiplier(2)

现在innerMultiplier被赋值给twice变量,但它仍然是一个可以调用的函数。

当你运行twice(5)时,你正在调用innerMultiplier,而factor被锁定在它的闭包中

这就是所谓的套用部分应用

一开始我也对这个语法感到困惑,但是不要害怕!变量"twice"只是被赋值给一个叫做闭包的特殊类型的函数,它可以访问包含函数的作用域、全局作用域和它自己的变量。但我不认为这是混淆的真正根源,这只是你如何称呼关闭。

为了更好地理解,我将简单地console.log()您的"twice"变量。您将看到它看起来就像一个普通的函数:

function (number) { 
       return number * factor;
}

就像我上面提到的,twice(2)将返回4,因为"factor"在包含范围内,而这个范围恰好是乘数函数,它的值为2。在你的问题中,twice变量实际上根本不需要

console.log(multiplier(2)(2));

希望这有助于澄清问题!