【问题标题】:JavaScript: changing timeout for infinite loops?JavaScript:更改无限循环的超时?
【发布时间】:2019-04-27 13:42:06
【问题描述】:

有时我会在 JavaScript 中出错并出现无限循环(例如:while(true){})。 Firefox 有用地报告“错误:脚本因超时而终止”或超出内存分配限制。如何更改此超时的长度?我想在开发过程中缩短它。

我还可以通过编写一个在循环内调用的函数来解决这个问题,该函数计算迭代次数并在迭代次数过多时引发异常。但我也对如何更改超时值感兴趣。

我没有看到这个超时记录,也没有通过搜索找到它。

【问题讨论】:

  • 你不能。当 JavaScript 运行时超过操作系统分配给它的内存时,就会发生这种情况。它是不可配置的。
  • 看看dom.max_script_run_time in about:config

标签: javascript infinite-loop


【解决方案1】:

不幸的是,用户无法在运行 javascript 的页面中配置最大递归限制。限制也因浏览器而异。

Browserscope 测试展示了用户从另一个 StackOverflow 问题关于该主题的测试结果:What are the js recursion limits for Firefox, Chrome, Safari, IE, etc?

除了编写自己的超时时间或使用承诺链来处理数据之外,您将无法自己更改超时时间。

【讨论】:

    【解决方案2】:

    有多种方法可以更改无限循环的超时时间。
    一种较短的方法是 setInterval:

    setInterval(function() {
       document.body.innerHTML += "Hello!<br>";
    }, 1000) //This number is, in milliseconds, the interval in which the function is executed.

    另一个更好的方法是 window.requestAnimationFrame。这为您提供了更高质量的动画(有关更多详细信息,请参阅Why is requestAnimationFrame better than setInterval or setTimeout);这是它的一个例子:

    function run() {
        setTimeout(function() {
            window.requestAnimationFrame(run);
            document.body.innerHTML += "Hello!<br>";
        }, 1000); // This sets an interval for the animation to run; if you take the setTimeout out the function will loop as quickly as possible without breaking the browser.
    }
    run();

    【讨论】:

    • 这不是 OP 所要求的。
    【解决方案3】:

    D.乔是对的。在 Firefox 中,浏览至 about:config 并更改 dom.max_script_run_time 中的秒数值。

    详见http://kb.mozillazine.org/Dom.max_script_run_time——你也可以消除超时。

    【讨论】:

      【解决方案4】:

      这将部分回答您的问题,但这是我处理这种情况的方式。与其说是修复,不如说是一种解决方法。

      重要提示:不要将此代码放在生产环境中。它只能在调试时在本地开发中使用。

      当我偶然发现这种情况时,我倾向于进行调试,因此我很可能使用 console.log 来输出到控制台。因此,我在我的应用程序入口点附近的任何地方覆盖了 console.log 函数:

      const log = console.log
      
      const maxLogCount = 200
      let currentLogCount = 0
      console.log = function (...msg) {
        if (currentLogCount >= maxLogCount) {
          throw new Error('Maximum console log count reached')
        }
      
        currentLogCount++
        log(...msg)
      }
      

      然后当我不小心这样做了

      while (true) {
          console.log("what is going on?")
      }
      

      输出 200 次后会出错。这将防止标签锁定半分钟而不得不重新打开一个新标签和bla bla bla。

      【讨论】:

        【解决方案5】:

        通常只是浏览器表示脚本内存不足的一种方式。您可以通过使用 for 循环或创建和索引变量并每次添加到它来解决这个问题,如下所示:

        var index = 0;
        while(true){
        if(index > certainAmount){
        break;
        }
        
        index++;
        }
        

        如果你真的想永远持续下去,请阅读setInterval()setTimeout()

        【讨论】:

        • 这是一种防止溢出的解决方法,但它不能回答 OP 的问题。
        猜你喜欢
        • 2013-11-12
        • 2021-01-08
        • 2016-01-28
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        相关资源
        最近更新 更多