为什么这个关闭会使浏览器崩溃?

时间:2012-10-01 01:25:18

标签: javascript

我正在写一个看起来像这样的闭包:

(function(){

   var OutterScope = 1;

   (function RunThisLoop() {

      OutterScope++;
      console.log(OutterScope);

      setInterval(RunThisLoop, 1000);

   })();

})();

以下是jsfiddle 。问题是控制台输出似乎是关闭的:它应该每秒更新,但它似乎每秒更新超过一秒,然后它最终崩溃浏览器。那是为什么?

4 个答案:

答案 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,您可以安排一组新的循环,并且由于您在循环中执行此循环,它会呈指数级增长:每秒您将调用次数增加一倍:

  1. 1
  2. 2
  3. 4
  4. 8
  5. 16
  6. 32
  7. 64
  8. 128
  9. 256
  10. 512
  11. 1 024
  12. 2 048
  13. 4 096
  14. 8 192
  15. 16 384
  16. 32 768
  17. 65 536
  18. 131 072
  19. 262 144
  20. 524 288
  21. 1 048 576
  22. 2 097 152
  23. 4 194 304
  24. 8 388 608
  25. 16 777 216
  26. 33 554 432
  27. 67 108 864
  28. 134 217 728
  29. 268 435 456
  30. 536 870 912
  31. 1 073 741 824
  32. 2 147 483 648