【发布时间】:2019-10-05 21:37:08
【问题描述】:
我在想当异步函数无限递归调用自己时会发生什么。我的想法是它不会导致堆栈溢出。但我无法准确指出为什么会这样。
const foo = async () => {
const txt = await Promise.resolve("foo");
console.log(txt);
foo();
}
foo();
上面的代码无限打印“foo”而不溢出堆栈。
我的想法是代码在概念上类似于以下,它不会导致堆栈溢出,因为对foo()的递归调用在回调内部,对foo()的原始调用将在此之前返回。
const bar = () => {
console.log("foo");
foo();
}
const foo = () => {
setImmediate(bar);
}
foo();
我正在寻找关于异步函数情况的确切答案。
【问题讨论】:
-
这是因为递归异步调用将等待 当前 执行完成,然后再创建一个新的堆栈帧。因此,您不会用完堆栈空间。 stackoverflow.com/questions/39459236/…
-
是的,你的解释是正确的。如果你愿意
await foo(),你可能会发生内存泄漏。