Something beautiful is on the way.

JavaScript 事件轮询机制

JavaScript 事件轮询机制

JavaScript 的事件轮询(Event Loop)是其实现异步编程的核心机制。以下是其工作原理的详细解释:

基本概念

  1. 单线程特性:JavaScript 是单线程语言,同一时间只能执行一个任务。
  2. 非阻塞 I/O:通过事件轮询机制实现异步操作,避免阻塞主线程。

事件轮询组成

事件轮询由以下几个主要部分组成:

  1. 调用栈(Call Stack):存储函数调用的栈结构,后进先出。
  2. 任务队列(Task Queue):包括宏任务队列和微任务队列。
  3. 事件轮询(Event Loop):持续检查调用栈和任务队列的机制。

执行流程

  1. 同步代码执行:所有同步代码直接进入调用栈执行。
  2. 异步处理
    • 遇到异步操作(setTimeout、Promise等)时,交给浏览器API处理
    • 完成后将回调函数放入相应的任务队列
  3. 事件轮询工作
    • 当调用栈为空时,事件轮询开始工作
    • 优先检查微任务队列并执行所有微任务
    • 然后从宏任务队列中取出一个任务执行
    • 重复此过程

任务类型

宏任务(Macro Tasks)

  • setTimeout / setInterval
  • I/O 操作
  • UI 渲染
  • setImmediate(Node.js)

微任务(Micro Tasks)

  • Promise.then / catch / finally
  • MutationObserver(浏览器)
  • process.nextTick(Node.js,优先级高于其他微任务)

示例分析

console.log('1');

setTimeout(() => console.log('2'), 0);

Promise.resolve().then(() => console.log('3'));

console.log('4');

// 输出顺序:1, 4, 3, 2

Node.js 与浏览器差异

Node.js 的事件轮询更为复杂,分为多个阶段:

  1. timers(定时器)
  2. pending callbacks(系统操作回调)
  3. idle, prepare(内部使用)
  4. poll(轮询I/O事件)
  5. check(setImmediate回调)
  6. close callbacks(关闭事件回调)

理解事件轮询机制对于编写高效、无阻塞的JavaScript代码至关重要,特别是在处理异步操作时。

posted @ 2025-05-30 21:46  张朋举  阅读(106)  评论(0)    收藏  举报