事件循环机制(综合)
一句话结论:记住“同步先跑完 → 清空微任务 → 再考虑渲染/下一轮宏任务”,就能推导出大多数执行顺序;卡顿通常来自“长任务 + 微任务堆积”。
1. 推导顺序的通用步骤
- 先把同步代码按调用栈顺序执行完
- 同步过程中注册的微任务进入 microtask queue
- 当前宏任务结束后,清空 microtask queue(直到为空)
- 浏览器在合适时机做一次渲染(可能发生)
- 进入下一轮宏任务
2. 常见“面试题”模板
console.log("A");
setTimeout(() => console.log("B"), 0);
Promise.resolve()
.then(() => console.log("C"))
.then(() => console.log("D"));
console.log("E");
// 常见:A E C D B
3. 性能经验
- 把长计算切片:让出主线程(例如分批处理/
requestIdleCallback/Worker) - 避免在微任务里递归追加微任务,否则会延后渲染与输入