最近我遇到了以下问题:
console.log("start");
const promise1 = Promise.resolve().then(() => {
console.log("promise1");
const timer2 = setTimeout(() => {
console.log("timer2");
}, 0);
});
const timer1 = setTimeout(() => {
console.log("timer1");
const promise2 = Promise.resolve().then(() => {
console.log("promise2");
});
}, 0);
console.log("end");
我最初的答案是
start, end, promise1, timer2, promise2, timer1
(错误的)。
我知道同步代码首先执行,然后是微任务,然后是宏任务。我还了解微任务可能出现在两个宏任务之间。我有点困惑,并没有完全意识到当我们在调用堆栈中执行
timer2
时,为什么 promise1
没有被宏任务排队。我也了解 JS 引擎在我们处理 timer1
时读取并排队 promise1
,但无法完全理解其原因。
对我来说,似乎首先读取全局声明的值。
下面是解决问题顺序的原理:
按照这个原则,似乎首先考虑的是全球价值观。我理解答案背后的逻辑,但无法找到关于“全局价值观被视为第一个陈述”是否正确的任何答案。我不确定为什么当我们处理
timer2
时 promise1
没有排队。我有点相信它已排队,但 timer1
的处理速度比 timer2
更快,因为它是全局声明的。 timer1
是否首先被读取并在 timer2
之前排队,因为它在全局范围内?其原因何在?我有点理解但不完全确定。