0

我在看这个功能

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 值感到困惑

4

2 回答 2

2

foo(2)返回一个接受一个参数 ( y) 的匿名函数。当您设置bar为 的返回值时foo(2)bar将成为对该匿名函数的引用。

因此,当您调用时,您bar(10)调用的是匿名函数foo返回,因此10被设置为参数y

于 2012-05-20T16:04:45.593 回答
2

这是一个闭包

当你写:

var bar = foo(2);

它实际上是在调用 foo,所以最终结果是:

var bar = function (y) {
    alert(2 + y + (++tmp));
}

其中tmp是闭包范围内的值。

因此,随后调用:

bar(10);

正在传递10函数,结果是:

alert(2 + 10 + (++tmp));

tmp每次调用创建的任何函数时都会增加foo

于 2012-05-20T16:07:46.323 回答