Skip to content

事件循环(Event Loop)

事件循环是 JavaScript 在浏览器和 Node.js 中执行异步任务的核心机制。它决定了“什么时候执行哪段代码”。

基本流程(极简版)

  1. 执行主线程上的同步代码。
  2. 异步任务完成后把回调放进队列。
  3. 事件循环不断从队列取任务执行。

任务队列与优先级

在多数运行时中,任务大致分成两类:

  • 宏任务(Macro Task):如 setTimeout、I/O。
  • 微任务(Micro Task):如 Promise.thenqueueMicrotask

微任务通常在一次宏任务结束后立即执行,因此“优先级更高”。

javascript
console.log('A');
setTimeout(() => console.log('B'));
Promise.resolve().then(() => console.log('C'));
console.log('D');
// 输出顺序:A D C B

为什么单线程也会有“并发感”

事件循环会在同步任务和异步任务之间来回切换,所以看起来像“同时发生”。

这也是共享状态在异步场景下容易出错的原因:任务交错执行,顺序不可预测。

常见误解

  • “单线程就没有并发问题”:错。异步切换同样会造成竞态。
  • await 会阻塞线程”:错。await 只是把后续逻辑放进微任务队列。

进一步阅读

如果你想理解更完整的执行流程,可以结合“竞态条件”“临界区”等概念一起阅读。

CC-BY 4.0 Licensed