我正在查看JavaScript练习,输出结果有点令人困惑。
每次在下面的代码中'计数器'被称为' i'输出到控制台增加,但在构造函数' i'重置为' 0'在对象代码的开头,所以应该真正返回' 1'每次'反击'被称为。
为什么'我'没有被重置为' 0'每次'反击'被称为?
提前致谢!)
function makeCounter() {
var i = 0;
return function() {
console.log( ++i );
};
}
var counter = makeCounter();
counter(); //Output is 1.
counter(); //Output is 2.
counter(); //Output is 3...
答案 0 :(得分:4)
请注意:调用counter()
不会调用makeCounter()
。它调用makeCounter返回的函数。由于返回的函数不会重置i
的值,i
永远不会重置。
i
仅设置为0
。正如该代码所示,makeCounter只被调用一次。
答案 1 :(得分:4)
i
每次都不会更改,因为您没有更新i
是通过closures
访问的,所以第一个函数只调用一次
更新它就像这样
function makeCounter() {
return function() {
var i = 0;
console.log( ++i );
};
}
var counter = makeCounter();
counter(); //Output is 1.
counter(); //Output is 1.
答案 2 :(得分:2)
您正在调用具有相同i
变量的同一个计数器,它不应该被重置,因为它只会在您实例化计数器时调用var i = 0;
然后它将继续调用{ {1}}要增加它,如果你想要新值,请调用一个新的计数器:
++i
答案 3 :(得分:0)
如果要重置计数器,则必须再次调用makeCounter(),因为它只返回您使用计数器访问的函数。闭包的概念只记得返回的函数。