我无法理解为什么调用recSetTimeOut()
不会导致堆栈溢出错误,而recPromise()
会。
const recSetTimeOut = () => {
console.log('in recSetTimeOut');
setTimeout(recSetTimeOut, 0)
};
recSetTimeOut();
const recPromise = () => {
console.log('in recPromise');
Promise.resolve().then(recPromise);
}
recPromise();
你能解释一下背后的过程吗?
编辑增加了更多信息
在Node.js v12.1.0和Chrome DevTools上运行这些片段:
const recSetTimeOut = () => { setTimeout(recSetTimeOut, 0); }
recSetTimeOut();
结果 Node
: 没有错误。
结果 Chrome
: 没有错误。
const recPromise = () => { Promise.resolve().then(recPromise); }
recPromise();
结果 Node
:
致命错误:表格大小无效 分配失败 - JavaScript堆内存不足
结果 Chrome
:
浏览器崩溃。
recSetTimeout
调用实际上是被安排的,不是当前函数堆栈的一部分。每次回调时,堆栈都是干净的,只有调度程序位于堆栈顶部。 - user47589