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

Why do javascript variables in closure functions not reset to a default when called multiple times?

本文关键字:调用 默认值 函数 闭包 javascript 变量 为什么      更新时间:2023-09-26

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

我的理解是,正如我们在makeCounter中专门设置i = 0;一样,每次通过counter变量调用makeCounter时,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

每次通过"计数器"变量调用makeCounter时

这是错误的。

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

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

如果您多次编写makeCounter()(),则会发生预期的行为。

每次 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