最近我遇到了一个问题:
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
(错误的一个).
我知道同步代码首先执行,然后是微任务,然后是macrotask.我也知道微任务可能出现在两个macrotask之间.我有点困惑,也不清楚为什么当我们在callstack中执行promise1
时,macrotask没有排队timer2
.我也理解JS引擎读取并排队timer1
,而我们正在处理promise1
,但不能完全理解它的原因.
对我来说,全局声明的值似乎是先读取的.
下面是解决问题顺序的原则:
- 首先,所有的微观任务都要完成.(我假设这意味着所有全局微任务优先.
- 执行一个宏任务.
- 所有(重新添加的)微任务都是重新任务.
- 执行以下宏问题.
- 循环重复/循环结束.
根据这一原则,似乎首先考虑全球价值观.我理解答案背后的逻辑,但找不到任何关于"全局值被视为第一个语句"是否正确的答案.我不知道为什么timer2
在处理promise1
时没有排队.我有点相信它是排队的,但timer1
的处理速度比timer2
快,因为它是全局声明的.timer1
是否先读取并在timer2
之前排队,因为它在全局作用域中?这是什么原因?我有点理解,但不完全肯定.