[英]why does this closure crash the browser?
我正在写一个看起来像这样的闭包:
(function(){
var OutterScope = 1;
(function RunThisLoop() {
OutterScope++;
console.log(OutterScope);
setInterval(RunThisLoop, 1000);
})();
})();
这里是的jsfiddle 。 问题在于控制台输出似乎关闭了:应该每秒更新一次,但似乎每秒更新一次以上,然后最终导致浏览器崩溃。 这是为什么?
调用RunThisLoop
并一次又一次地设置时间间隔可能会耗尽资源...
您可能需要setTimeout
或将setInterval
移到RunThisLoop
之外。
每次运行该功能时,都会添加更多的计划间隔计时器。 最终,他们滚雪球并消耗了所有CPU资源。
这是修复它的最佳方法(几乎没有没有clearInterval()
就可以使用setInterval()
方案):
(function(){
var OuterScope = 1;
var myInterval = setInterval(RunThisLoop, 1000);
function RunThisLoop() {
OuterScope++;
console.log(OuterScope);
//stop clause
if (OuterScope > 10) clearInterval(myInterval);
};
})();
当您运行RunThisLoop()时,将创建一个包含其本地状态的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
然后,对RunThisLoop()的递归调用将为新实例的本地状态创建一个新的上下文。
糟糕! 堆栈溢出!
已经回答了,这只是一个澄清:
通过使用setInterval
您可以计划一组新的循环,并且由于您在循环内执行该循环,因此它呈指数增长:每秒钟您将调用次数加倍:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.