我正在写一个看起来像这样的闭包:
(function(){
var OutterScope = 1;
(function RunThisLoop() {
OutterScope++;
console.log(OutterScope);
setInterval(RunThisLoop, 1000);
})();
})();
以下是jsfiddle 。问题是控制台输出似乎是关闭的:它应该每秒更新,但它似乎每秒更新超过一秒,然后它最终崩溃浏览器。那是为什么?
答案 0 :(得分:2)
可能会因调用RunThisLoop
并一次又一次地设置间隔而耗尽资源......
您可能需要代替setTimeout
或将setInterval
移到RunThisLoop
之外。
答案 1 :(得分:2)
每次运行该功能时,都会添加更多预定的间隔计时器。最终他们滚雪球并消耗所有CPU资源。
这是解决问题的最佳方式(几乎没有setInterval()
可以在没有clearInterval()
的情况下使用的情况):
(function(){
var OuterScope = 1;
var myInterval = setInterval(RunThisLoop, 1000);
function RunThisLoop() {
OuterScope++;
console.log(OuterScope);
//stop clause
if (OuterScope > 10) clearInterval(myInterval);
};
})();
答案 2 :(得分:1)
运行RunThisLoop()时,会创建一个上下文来包含其本地状态 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新的上下文 ... 哎呀!堆栈溢出!
答案 3 :(得分:0)
已经回答了,这只是一个澄清:
通过使用setInterval
,您可以安排一组新的循环,并且由于您在循环中执行此循环,它会呈指数级增长:每秒您将调用次数增加一倍: