gpt4 book ai didi

javascript - 为什么无限递归异步函数不会导致堆栈溢出?

转载 作者:可可西里 更新时间:2023-11-01 02:45:07 25 4
gpt4 key购买 nike

我在想当异步函数无限递归地调用自身时会发生什么。我的想法是它不会导致堆栈溢出。但我无法准确指出为什么会这样。

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();

我正在寻找关于在异步函数的情况下会发生什么的确切答案。

最佳答案

这个函数是

的语法糖
const foo = () => 
Promise.resolve(
Promise.resolve("foo")
.then(txt => {
console.log(txt);
foo();
})
);

foo();

这本身可以用更少的依赖重写为

const foo = () =>
queueMicrotask(() =>
queueMicrotask(() => {
console.log("foo");
foo();
})
);
foo();

Window.queueMicrotask是一种全新的方法,它为我们提供了一种触发 queue a microtask 的方法Promise.resolve 和 await 触发的操作。
基本上,这个操作在当前执行结束时推送微任务,但在当前事件循环结束之前。

算法第六点读

Set task's script evaluation environment settings object set to an empty set.

这就是为什么这里没有堆栈溢出的原因。但是,由于您永远不会退出事件循环,您正在阻止浏览器。

关于javascript - 为什么无限递归异步函数不会导致堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56205298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com