我有这样一段代码
async function loop() {
for (let i = 0; i < 3; i++) {
console.log(i,new Error("").stack);
await 1;
}
}
loop();
当我在 Node(Chrome 引擎)中运行它时,我得到这个:
0 Error
at loop (file:///Users/user/Desktop/test.mjs:3:19)
at file:///Users/user/Desktop/test.mjs:8:1
at ModuleJob.run (node:internal/modules/esm/module_job:217:25)
at async ModuleLoader.import (node:internal/modules/esm/loader:308:24)
at async loadESM (node:internal/process/esm_loader:42:7)
at async handleMainPromise (node:internal/modules/run_main:66:12)
1 Error
at loop (file:///Users/user/Desktop/test.mjs:3:19)
2 Error
at loop (file:///Users/user/Desktop/test.mjs:3:19)
因此,在等待之后,执行似乎失去了更广泛的上下文,但保留了函数的上下文。
当我在 Bun(Safari 引擎)中运行相同的代码时,我得到:
0 Error:
at <anonymous> (/Users/user/Desktop/test.mjs:3:10)
at loop (/Users/user/Desktop/test.mjs:1:22)
at module code (/Users/user/Desktop/test.mjs:5:5)
1 Error:
at <anonymous> (/Users/user/Desktop/test.mjs:3:10)
2 Error:
at <anonymous> (/Users/user/Desktop/test.mjs:3:10)
这表示执行甚至会丢失函数的上下文。
现在,我或多或少知道当我像这样使用await 时会发生什么。它强制将内容推送到微任务队列,让堆栈上的其余同步代码执行,因此我们会丢失堆栈,并随后拾取推送到队列的内容。
但是,我对这种情况到底是如何发生的并查看这些不同的错误堆栈很感兴趣,我真的很困惑。使用await后我们是在同一个函数中还是在前一个函数的上下文中以某种方式创建了一个新函数?