在下面的代码中,有人可以向我解释为什么多次调用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
答案 0 :(得分:8)
每次通过“计数器”变量
调用makeCounter
这是错误的。
您只能在makeCounter()
致电var counter = makeCounter();
一次。
counter
是对返回的函数的引用,它会关闭i
变量。
调用counter()
将执行此返回的函数,就像任何其他函数一样。
如果你多次写makeCounter()()
,就会发生你期望的行为。
答案 1 :(得分: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