4

在下面的代码中,有人可以向我解释为什么多次调用会counter导致i每次调用时值都增加?

我的理解是,正如我们在 中专门设置i = 0;makeCounter,每次makeCounter通过counter变量调用,i都应该重置为 0。我不明白为什么不是这样。

function makeCounter() {
  // `i` is only accessible inside `makeCounter`.
  var i = 0;

  return function() {
    console.log( ++i );
  };
}

// Note that `counter` and `counter2` each have their own scoped `i`.

var counter = makeCounter();
counter(); // logs: 1
counter(); // logs: 2
4

2 回答 2

9

每次通过“计数器”变量调用 makeCounter

那是错的。

你只打了makeCounter() 一次电话——在var counter = makeCounter();
counter是对返回函数的引用,它关闭了i变量。

调用counter()将执行这个返回的函数,就像任何其他函数一样。

makeCounter()()如果您多次写入,您所期望的行为将会发生。

于 2013-07-01T14:29:05.653 回答
1

每次调用 makeCounter […]i都应该重置为0

这是正确的。

makeCounter通过counter变量调用

不,这不对。返回的匿名函数用makeCounter调用counter()makeCounter只被调用一次,它的结果被赋值给counter变量。

请注意,counter每个counter2都有自己的作用域i

是这样的,是的。但是,您的示例不完整:

var counter = makeCounter();
counter(); // logs 1
var counter2 = makeCounter();
counter2(); // logs 1 again!
counter(); // still logs 2
counter2(); // logs 2
于 2013-07-01T14:41:06.767 回答