事件循环是JavaScript运行时环境实现异步编程的核心机制,由调用栈、宏任务队列和微任务队列协同工作,每轮执行一个宏任务后清空所有微任务,微任务优先级高于宏任务且不触发UI渲染。
JavaScript 的事件循环(Event Loop)是它实现异步编程的核心机制,负责协调同步代码执行、回调队列和任务调度。它不是 JavaScript 引擎本身的语法特性,而是运行时环境(如浏览器或 Node.js)提供的底层模型。
事件循环围绕一个“调用栈”(Call Stack)和多个“任务队列”运转。主要包含:
事件循环每轮先执行一个宏任务,然后清空整个微任务队列(所有当前可执行的微任务),再进入下一个宏任务。
这是理解调度行为的关键。微任务总是在当前宏任务结束后、下一个宏任务开始前执行,且具有更高优先级。
下面这段代码能清晰体现执行顺序
:
console.log(1); setTimeout(() => console.log(2), 0); // 宏任务 Promise.resolve().then(() => console.log(3)); // 微任务 console.log(4);
输出结果是:1 → 4 → 3 → 2。原因:
两者都遵循事件循环模型,但阶段划分更精细(Node.js 有 timer、pending callbacks、idle/prepare、poll、check、close callbacks 六个阶段)。例如:
setImmediate() 属于 check 阶段,在 poll 阶段之后;process.nextTick() 不属于任何阶段,而是在每个阶段切换前优先执行,优先级高于微任务;实际开发中,应优先使用 Promise 和 queueMicrotask() 保证跨平台一致性。