什么是事件循环?

事件循环(Event Loop)是 JavaScript 运行时的核心机制,负责处理异步操作和回调函数的执行顺序。它使得 JavaScript 能在单线程环境中高效处理并发任务,是理解异步编程的关键。

核心工作原理

  1. 同步代码执行
    所有同步任务按顺序执行,阻塞后续代码。 💡 例如:console.log('同步代码') 会立即输出,不会等待异步操作。

  2. 事件队列
    异步任务完成后,将其回调函数放入事件队列中等待执行。 ⚡ 事件队列分为 宏任务(Macrotask)微任务(Microtask),微任务优先级更高。

  3. 循环处理
    事件循环不断从队列中取出任务执行,形成循环。

JavaScript_事件循环

事件循环的阶段 🔄

  1. 微任务(Microtask)

    • process.nextTick()
    • Promise.then() / Promise.catch()
    • queueMicrotask()
    • 执行完当前任务后立即处理,如图所示:
      微任务_事件循环阶段
  2. 宏任务(Macrotask)

    • setTimeout / setInterval
    • setImmediate(Node.js 特有)
    • UI 事件(如点击、滚动)
    • 例如:
      setTimeout(() => {
        console.log('宏任务');
      }, 0);
      
宏任务_事件循环阶段

常见误区 ⚠️

  • 误区 1:事件循环是 JavaScript 的“主线程”
    实际上,事件循环是运行在主线程上的一个循环机制,而真正的异步操作由浏览器或 Node.js 的线程池处理。

  • 误区 2setTimeout 是立即执行的
    setTimeout 的最小延迟是 4ms(浏览器中),且会被事件循环调度。

  • 误区 3:微任务总在宏任务之前执行
    每次事件循环迭代中,微任务会在宏任务之前执行。

拓展学习 📚

异步编程_事件循环