[英]Using closure for counting inside a function
我试过了,它总是显示1次,出了点问题,如何解决这个问题?
function myFunc() {
var increment = (function() {
var i = 0;
return function() {
i++;
return i;
};
})();
alert(`calling myFunc ${increment()} times`);
}
任何时候你调用我的函数,它都会重新定义增量 function,所以你不应该期望它会说除1
之外的任何内容。 您的问题是每次调用myFunc
时都会定义增量
你想要做的是:
var i = 0;
function myFunc() {
var increment = (function() {
return function() {
i++;
return i;
};
})();
alert(`calling myFunc ${increment()} times`);
}
所以现在i
将在调用myFunc
之间保留它的值。 它必须在myFunc
之外。 或者您可以将整个 function 移到myFunc
之外。
var increment = (function() {
var i = 0;
return function() {
i++;
return i;
};
})();
function myFunc() {
alert(`calling myFunc ${increment()} times`);
}
现在这有效:
console.log(increment()); // logs 1
console.log(increment()); // logs 2
问题是,当一个变量超出 scope 时,它会被销毁,下次调用一个值时,它将被重新创建,并以它开始的任何值初始化。 由于变量i
被限定在increment
function 内,而增量 function 本身的作用域是myFunc
,这意味着当myFunc
关闭时,该闭包将在下一次运行 function 时创建。
一个例子显示i
被提升到myFunc
的 scope 和increment
function 运行多次。
function myFunc() { console.log('running myFunc'); var i = 0; console.log('assigning i to ' + i); function increment() { console.log('incrementing'); i++; }; increment(); increment(); console.log(`calling myFunc ${i} times`); } myFunc();
请注意, i
现在在对increment
的调用中维护其 state 。 现在当我们多次调用myFunc
时,我们看到i
被销毁,然后当myFunc
再次运行时会创建一个新变量。
function myFunc() { console.log('running myFunc'); var i = 0; console.log('assigning i to ' + i); function increment() { console.log('incrementing'); i++; } increment(); increment(); console.log(`calling myFunc ${i} times`); } myFunc(); myFunc();
现在,如果我们将i
提升到myFunc
的 scope 之上,我们将看到它的值在对myFunc
的调用中保持在 scope 内。
var i = 0; console.log('assigning i to ' + i); function myFunc() { console.log('running myFunc'); function increment() { console.log('incrementing'); i++; } increment(); console.log(`calling myFunc ${i} times`); } myFunc(); myFunc();
为我工作。
var increment = (function() { var i = 0; return function() { i++; return i; }; })(); console.log(increment()); console.log(increment()); console.log(increment());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.