function multiplier(factor) {
return function(number) {
return number * factor;
};
}
var twice = multiplier(2);
console.log(twice(5));
//output 10
有人可以解释为什么'number'参数不会返回undefined?我真的很难理解如何将变量“两次”定义为具有固定值2的函数,因为它的参数可以用作具有可通过参数5的函数?
答案 0 :(得分:4)
简短回答:
当您var twice = multiplier(2);
与以下内容相同时:
twice = function (number) {return number * 2};
想象一下,Multiplier是一个Class,它有一个属性factor
(初始化对象所需),当初始化Multiplier时,它返回一个函数,它接收number
并乘以{{1 }}
答案 1 :(得分:2)
定义变量'两次'作为具有固定值2的函数
那不是你在那里做的。 Twice
只是reference
内函数(closure
)的指针(multiplier
)。
答案 2 :(得分:2)
在第一个电话中,您正在传递和修复因子参数:
var twice = multiplier(2);
参数变为“固定”,因为multiplier
返回的函数捕获factor
变量值,然后factor
函数返回后对multiplier
的引用丢失,所以factor
永远不会再改变。
(请参阅MDN上的closures)
twice
现在是这样的函数:
function(number) {
return number * 2;
}
在第二个调用中,您将使用twice
函数传递5作为数字参数。
答案 3 :(得分:1)
此行为是javascript被称为闭包并以最简单的方式 闭包是一个持久的局部变量作用域,它允许您访问已被执行传递的变量。
因此,在您的示例中,因子是乘数函数的局部因子。但是你的内部函数捕获它并用它来计算乘法。那时,因子成为一个闭包,它不会从内存中删除。然后,当您使用5调用内部函数(返回)时,它使用捕获的变量值2来获取值10.这里的因子是闭包。
如果您想了解更多内容,请参阅'道格拉斯·克罗克福德的javascript好的部分'一书和http://javascriptissexy.com/understand-javascript-closures-with-ease/中的闭包。