Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个闭包会使浏览器崩溃?_Javascript - Fatal编程技术网

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
您可以安排一组新的循环,由于您在循环中这样做,因此它会以指数形式增长:每秒调用的次数会增加一倍:

  • 一,
  • 二,
  • 四,
  • 八,
  • 十六,
  • 三十二
  • 六十四
  • 128
  • 256
  • 512
  • 1024
  • 2048
  • 4096
  • 8192
  • 16384
  • 32768
  • 65536
  • 131072
  • 262144
  • 524288
  • 1048576
  • 2097152
  • 4194304
  • 8388608
  • 16777216
  • 33554432
  • 67108864
  • 134 217 728
  • 268435456
  • 536870912
  • 1073741824
  • 2147483648

  • 已经回答了,这只是一个澄清:

    通过使用
    setInterval
    您可以安排一组新的循环,由于您在循环中这样做,因此它会以指数形式增长:每秒调用的次数会增加一倍:

  • 一,
  • 二,
  • 四,
  • 八,
  • 十六,
  • 三十二
  • 六十四
  • 128
  • 256
  • 512
  • 1024
  • 2048
  • 4096
  • 8192
  • 16384
  • 32768
  • 65536
  • 131072
  • 262144
  • 524288
  • 1048576
  • 2097152
  • 4194304
  • 8388608
  • 16777216
  • 33554432
  • 67108864
  • 134 217 728
  • 268435456
  • 536870912
  • 1073741824
  • 2147483648

  • 是的,
    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);    
       };
    
    })();​