如何理解 JavaScript 中的事件循环(Event Loop)?

JavaScript 采用单线程执行模型,通过事件循环(Event Loop)实现异步编程。事件循环通过协调调用栈(Call Stack)、宏任务队列(Macro Task Queue)和微任务队列(Micro Task Queue)的执行顺序,实现非阻塞式并发。

事件循环核心流程如下:

  1. 同步执行:浏览器主线程依次执行全局同步代码,将函数调用压入调用栈。
  2. 异步调度:当遇到异步操作(如 setTimeoutPromise.thenfetch 等)时,其回调函数被放入对应队列。
  3. 任务调度:当调用栈为空时,优先执行微任务队列(Micro Task),再依次处理宏任务队列(Macro Task)。
  4. 循环执行:重复上述过程,直至所有任务完成。

关键特性:

  • 微任务(如 Promise.thenqueueMicrotaskMutationObserver)优先级高于宏任务(如 setTimeoutsetInterval、I/O 操作)。
  • 每次宏任务执行完成后,立即清空当前所有微任务,继续执行下一个宏任务。

示例解析:

console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');

输出顺序为:1 → 4 → 3 → 2

解析:

  • '1' 和 '4' 为同步代码,优先执行。
  • Promise.then 回调被加入微任务队列,等待执行。
  • setTimeout 回调被加入宏任务队列,延迟执行。
  • 同步代码执行完毕后,先处理微任务(输出 '3'),再执行宏任务(输出 '2')。

事件循环是 JavaScript 异步编程的核心机制,理解其工作原理对避免常见陷阱(如定时器延迟、Promise 执行时机)具有关键意义。

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: