Javascript 为什么这个闭包会使浏览器崩溃?
我正在写一个类似这样的结尾:Javascript 为什么这个闭包会使浏览器崩溃?,javascript,Javascript,我正在写一个类似这样的结尾: (function(){ var OutterScope = 1; (function RunThisLoop() { OutterScope++; console.log(OutterScope); setInterval(RunThisLoop, 1000); })(); })(); 这是。问题是控制台输出似乎关闭了:它应该每秒钟更新一次,但它似乎每秒钟更新超过一秒,然后它最终会使浏览器崩溃。
(function(){
var OutterScope = 1;
(function RunThisLoop() {
OutterScope++;
console.log(OutterScope);
setInterval(RunThisLoop, 1000);
})();
})();
这是。问题是控制台输出似乎关闭了:它应该每秒钟更新一次,但它似乎每秒钟更新超过一秒,然后它最终会使浏览器崩溃。为什么会这样?调用
RunThisLoop
并一次又一次地设置间隔很可能会耗尽资源
您可能希望使用
setTimeout
,或者将setInterval
移到RunThisLoop
之外,因为调用RunThisLoop
并一次又一次地设置间隔,很可能会耗尽资源
您可能希望改为
setTimeout
,或者将setInterval
移到RunThisLoop
之外每次运行该函数时,都会添加更多的计划间隔计时器。最终,它们会滚雪球并消耗所有CPU资源
这是修复它的最佳方法(几乎没有任何情况下,如果没有clearInterval()
,则可以使用setInterval()
):
每次运行该函数时,都会添加更多的计划间隔计时器。最终,它们会滚雪球并消耗所有CPU资源 这是修复它的最佳方法(几乎没有任何情况下,如果没有
clearInterval()
,则可以使用setInterval()
):
运行RunThisLoop()时,将创建一个包含其本地状态的上下文。然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
... 哎呀!堆栈溢出 运行RunThisLoop()时,将创建一个包含其本地状态的上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
然后,对RunThisLoop()的递归调用为新实例的本地状态创建一个新上下文。
...
哎呀!堆栈溢出 已经回答了,这只是一个澄清: 通过使用
setInterval
您可以安排一组新的循环,由于您在循环中这样做,因此它会以指数形式增长:每秒调用的次数会增加一倍:
已经回答了,这只是一个澄清: 通过使用
setInterval
您可以安排一组新的循环,由于您在循环中这样做,因此它会以指数形式增长:每秒调用的次数会增加一倍:
是的,
setTimeout
可能就是我们要找的。setInterval将导致指数繁殖。是的,setTimeout
可能就是我们所寻找的。setInterval将导致指数繁殖。你是不是在脑子里写出来的?我通常会在2^18时发牢骚,因为这是第一个很少用作任何类型的靶场或面具的靶场。@AlexPakka 1-17
(function(){
var OuterScope = 1;
var myInterval = setInterval(RunThisLoop, 1000);
function RunThisLoop() {
OuterScope++;
console.log(OuterScope);
//stop clause
if (OuterScope > 10) clearInterval(myInterval);
};
})();