JavaScript事件循环按“同步→微任务(全清)→宏任务(一个)”三步循环执行;同步代码先运行,随后立即清空所有微任务(如Promise.then),再执行一个宏任务(如setTimeout),以此保证异步顺序。
JavaScript 的事件
循环是它实现异步编程的底层调度机制,核心在于“单线程不阻塞”——同步代码优先执行,异步任务交由宿主环境(如浏览器或 Node.js)托管,再按规则分批回调到主线程。
JavaScript 引擎执行代码时,所有同步函数都压入调用栈(Call Stack),按顺序执行、弹出。一旦栈变空,事件循环立刻介入:不是马上挑一个异步任务来跑,而是先检查有没有微任务等着处理。
两类任务由不同机制产生,优先级也不同:
注意:process.nextTick 是 Node.js 特有,优先级比 Promise.then 还高,但它不属于标准 Web API。
可以理解为三步固定节奏:
然后回到第1步,开启下一轮。这个“同步 → 微任务(全清)→ 宏任务(一个)”的节奏,就是控制异步行为顺序的关键。
它直接决定你写的异步代码是否按预期执行。比如下面这段:
console.log('A');输出一定是 A → D → C → B。因为 C 是微任务,在同步代码(A、D)结束后立刻执行;B 是宏任务,要等下一轮循环才轮到。
不复杂但容易忽略