封闭功能行为混乱

时间:2015-08-11 18:51:37

标签: javascript

function multiplier(factor) {
  return function(number) {
    return number * factor;
  };
}

var twice = multiplier(2);
console.log(twice(5));
//output 10

有人可以解释为什么'number'参数不会返回undefined?我真的很难理解如何将变量“两次”定义为具有固定值2的函数,因为它的参数可以用作具有可通过参数5的函数?

4 个答案:

答案 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/中的闭包。