← 返回文章归档

前端

深入理解 JavaScript 事件循环

从宏任务到微任务,重新梳理浏览器与 Node.js 中异步代码的节奏。

理解事件循环,关键不是背诵一张队列图,而是弄清楚 JavaScript 执行栈、任务队列和宿主环境之间如何交接工作。

同步代码先在当前调用栈中运行。调用栈清空之后,宿主环境会安排已经就绪的任务继续执行。浏览器通常先处理微任务,再进入下一次渲染机会;定时器回调则要等到计时结束并排入任务队列后才能执行。

因此,setTimeout(fn, 0) 并不意味着 fn 会立刻运行。它表示回调最早在后续任务中得到执行机会。Promise.then 这类微任务通常会在当前任务结束后、浏览器绘制之前运行。

调试异步问题时,可以把代码按「当前任务、微任务、后续任务、渲染」分组逐步标注。与其猜测时间,不如明确每段工作进入了哪一类队列。

DISCUSSION

想继续聊聊?

欢迎到 GitHub Discussions 留下补充、问题或不同看法。

前往讨论区