为什么多次调用时,闭包函数中的javascript变量不会重置为默认值?

时间:2013-07-01 14:27:10

标签: javascript closures scope

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

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

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

2 个答案:

答案 0 :(得分:8)

  

每次通过“计数器”变量

调用makeCounter

这是错误的。

您只能在makeCounter()致电var counter = makeCounter(); 一次counter是对返回的函数的引用,它会关闭i变量。

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

如果你多次写makeCounter()(),就会发生你期望的行为。

答案 1 :(得分:1)

  

每次调用makeCounter时[...] i都应重置为0

没错。

  通过makeCounter变量

调用

counter

不,不是。 makeCounter返回的匿名函数使用counter()调用。 makeCounter仅被调用一次,其结果已分配给counter变量。

  

请注意,countercounter2各自都有自己的范围i

情况就是这样,是的。但是你的例子不完整:

var counter = makeCounter();
counter(); // logs 1
var counter2 = makeCounter();
counter2(); // logs 1 again!
counter(); // still logs 2
counter2(); // logs 2