Javascript闭包中分配给变量的函数的附加参数
Additional arguments for functions assigned to variables in Javascript closures
我正在阅读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));
希望这有助于澄清问题!
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 为什么不'我们在javascript中使用函数参数的数据类型
- 使用闭包共享构造函数参数
- 函数参数的值错误
- 当一个重要的构造函数参数丢失时应该发生什么
- 阻止ReSharper将JavaScript函数参数放到新行中
- 根据函数参数将CSS值存储在var中,然后对其进行操作
- 使构造函数参数具有ES6类方法的特权
- 当客户端将两个按钮的javascript函数参数修改为相同时,SQL/PHP会更新多行
- Windows.Networking.EndpointPair构造函数参数
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- 大括号中的Javascript函数参数
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- 将JSON字符串转换为函数参数
- eval()读取函数参数有多糟糕
- Javascript不能在一个命令中使用函数参数
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- ES6类构造函数参数
- 是否可以在javascript函数参数列表中调用多个函数