javascript - 虽然循环崩溃,但递归函数抛出最大调用堆栈超出错误

标签 javascript recursion while-loop

这是一个简单的问题,但我找不到任何人解决它。

使用 chrome,在本地主机上运行程序。 如果我有一个永远不会破坏条件的 while 循环,它会导致页面卡住,没有错误,我什至无法关闭 chrome 上的选项卡。

如果我有一个递归函数,它会无限地调用自己。将抛出最大调用堆栈错误。

为什么 while 循环没有故障保护?当 while 循环无限期运行时,如何避免页面卡住? (除了正确编写 while 循环)

最佳答案

你所说的故障安全是所有实现中都缺少的功能,除了 Safari,它已经实现了 tail call optimization 的 ES2016 JavaScript 要求。 .在 Safari 中,您不会注意到它们之间的任何区别:

while (true) {
  // code
}

(function loop () {
   // code
   loop()
})();

没有堆栈溢出,正如预期的那样,浏览器永远卡住。这样做的原因是,除非你使用 worker,否则 JS 是单线程的,并且轮流队列中的其他 JS 代码不会被执行。例如。

setTimeout(function(){ alert("This will never happen!"); }, 0);
(function loop () {
   loop()
})();

您不应该编写不会终止的 while 循环。如果你犯了一个错误,我建议你暂时做一个断点,以检查它为什么不终止。或者,如果您认为有问题,您可以这样做:

// TODO: remove debug limit
let limit = 100000; // limit
while (true)) {
    if(!limit--) {
        console.log('limit exceeded');
        break; // set breakpoint here in debugger
    }
}

背后是你需要在问题解决后删除它。我的 IDE 提示那个 TODO,所以它永远不会进入 git。你可以对尾调用做同样的事情:

// TODO: remove debug limit
let limit = 100000; // limit
(function loop () {
      // code
      if(!limit--) {
          console.log('limit exceeded');
          return; // set breakpoint here in debugger
      }
      if (true) loop(); // might have another expression than true
})();

关于javascript - 虽然循环崩溃,但递归函数抛出最大调用堆栈超出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56979530/

相关文章:

java - 从数组中减去不起作用

java - 强制返回到 while 循环

javascript - 基于动态复选框和文本输入的 setState 数组

c - 搜索二叉树最大高度的递归代码

Python celery worker_main "RuntimeError: maximum recursion depth exceeded"

c++ - 使用二进制搜索的模板递归

java - 基于 int 值的字符串

Javascript:需要正则表达式将字符串拆分为数组,保留小数点和引号不变

javascript - 在同一选项卡中启动下载,无需在 Javascript 中打开新选项卡或窗口

javascript - 从 CasperJS start() 读取本地 HTML 文件