JavaScript 事件循环
本节目标:区分同步代码、微任务和任务,并预测常见 Promise 与定时器回调的执行顺序。
调度模型
JavaScript 执行当前调用栈中的同步代码。浏览器和 Node.js 等宿主管理定时器、I/O、事件等工作;完成后把回调排入相应队列。事件循环在适当时机取出任务执行。具体细节依宿主环境而异。
Promise 的 then 回调属于微任务。在浏览器一次任务结束后,运行时会清空微任务队列,再进入后续任务和渲染机会。
js
console.log("同步");
setTimeout(() => console.log("定时器任务"), 0);
Promise.resolve().then(() => console.log("Promise 微任务"));
console.log("结束同步");典型浏览器输出:
text
同步
结束同步
Promise 微任务
定时器任务定时器的 0 毫秒表示尽早安排,不保证立刻运行;嵌套定时器和后台标签页还可能被限速。
避免阻塞
长时间同步计算会阻塞当前线程,使页面不能及时响应输入或绘制。将工作拆分为较小任务,或把可并行的计算放进 Web Worker。微任务若无限递归排队,也会推迟渲染与后续任务。
小结与练习
- 同步代码先执行;Promise 回调通常作为微任务;定时器回调是后续任务。
setTimeout(fn, 0)不是立即执行保证。- 宿主调度细节有差异,涉及 I/O 时应查对应运行时文档。
练习:在示例中加入 queueMicrotask() 和两个 Promise 回调,预测并验证顺序。