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

Ben*_*enM 4 javascript closures scope

在下面的代码中,有人可以向我解释为什么多次调用会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
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 9

每次makeCounter都通过"counter"变量调用

那是错的.

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

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

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

  • 我明白了,所以makeCounter返回的函数是唯一执行的部分而不是i = 0的声明.如果返回的函数是以下.. return function(){i = 0; console.log(++ i); }; 然后'我'只会等于1,这是正确的吗? (2认同)