前端
深入理解 JavaScript 事件循环
从宏任务到微任务,重新梳理浏览器与 Node.js 中异步代码的节奏。
理解事件循环,关键不是背诵一张队列图,而是弄清楚 JavaScript 执行栈、任务队列和宿主环境之间如何交接工作。
同步代码先在当前调用栈中运行。调用栈清空之后,宿主环境会安排已经就绪的任务继续执行。浏览器通常先处理微任务,再进入下一次渲染机会;定时器回调则要等到计时结束并排入任务队列后才能执行。
因此,setTimeout(fn, 0) 并不意味着 fn 会立刻运行。它表示回调最早在后续任务中得到执行机会。Promise.then 这类微任务通常会在当前任务结束后、浏览器绘制之前运行。
调试异步问题时,可以把代码按「当前任务、微任务、后续任务、渲染」分组逐步标注。与其猜测时间,不如明确每段工作进入了哪一类队列。
