如何理解 JavaScript 中的事件循环(Event Loop)?
JavaScript 采用单线程执行模型,通过事件循环(Event Loop)实现异步编程。事件循环通过协调调用栈(Call Stack)、宏任务队列(Macro Task Queue)和微任务队列(Micro Task Queue)的执行顺序,实现非阻塞式并发。
事件循环核心流程如下:
- 同步执行:浏览器主线程依次执行全局同步代码,将函数调用压入调用栈。
- 异步调度:当遇到异步操作(如
setTimeout、Promise.then、fetch等)时,其回调函数被放入对应队列。 - 任务调度:当调用栈为空时,优先执行微任务队列(Micro Task),再依次处理宏任务队列(Macro Task)。
- 循环执行:重复上述过程,直至所有任务完成。
关键特性:
- 微任务(如
Promise.then、queueMicrotask、MutationObserver)优先级高于宏任务(如setTimeout、setInterval、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 执行时机)具有关键意义。

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