我正在看这个函数
function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2); // bar is now a closure.
bar(10);
当我运行它时,变量得到以下值
x = 2, y = 10 tmp = 3。
现在我看到在foo(2)中x被传递为2.因此可以理解x的值是2.然后bar(10)将值0赋给y。怎么样?我很困惑接收函数如何知道10是由bar(10)分配的y的值
答案 0 :(得分:2)
foo(2)
返回一个匿名函数,该函数接受一个参数(y
)。当您将bar
设置为foo(2)
的返回值时,bar
将成为对该匿名函数的引用。
因此,当您致电bar(10)
时,您正在调用匿名函数foo
返回,因此10
被设置为参数y
。
答案 1 :(得分:2)
这是一个闭包。
当你写:
var bar = foo(2);
它实际上是调用 foo
,因此最终结果是:
var bar = function (y) {
alert(2 + y + (++tmp));
}
其中tmp
是闭包在范围内的值。
所以,随后打电话:
bar(10);
将10
传递给 函数,结果为:
alert(2 + 10 + (++tmp));
每次调用使用tmp
创建的任何函数时, foo
都会增加