javascript - 运行递归超时时避免堆栈溢出

标签 javascript node.js

所以,我想运行一个间隔函数,但有一个递归超时:

var runUpdater = function () {
  setTimeout(() => {
    console.log('something here')
    runUpdater()
  }, 1000)
}

这将在一个长期运行的服务上运行。我认为这最终会导致堆栈溢出,对吗?我的问题是:避免这种情况的最佳方法是什么?

最佳答案

不,不会出现堆栈溢出。每次调用 setTimeout 都会在事件循环中排队一条新消息。当执行 setTimeout 回调时,您将拥有一个深度为 1 的全新堆栈,该堆栈将在该执行线程完成时不再存在。例如,当达到最大堆栈大小时,以下代码将快速抛出 RangeError:

try {
    !function func ( ) {
        func();
    }();
} catch ( e ) {
    document.body.innerHTML = e.message;
}

但是这个版本将无限期运行而不会出现问题:

try {
    !function func ( ) {
        setTimeout( func, 0 );
    }();
} catch ( e ) {
    document.body.innerHTML = e.message;
}

关于javascript - 运行递归超时时避免堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34697067/

相关文章:

javascript - 变量可以在单个函数调用期间更改值(从外部吗?)

javascript - 为什么删除对象后setTimeout仍然调用回调

javascript - 使用 Nodejs 创建命令行实用程序所需的输入

node.js - App Engine Flexible 上的 HTTP 到 HTTPS 重定向

javascript - Bootstrap 选择不更改图标集

javascript - 使用 jQuery 对 li 进行排序

javascript - JavaScript 最快的 JSON 解析器是什么?

node.js - 如何在 MongoDB 中为 NodeJS Express 应用程序存储站点配置?

node.js - Amazon S3 403 禁止错误适用于 KML 文件,但不适用于 JPG 文件

Javascript 正则表达式查找可以跨多行中断的特定字符串