最初的

Kratos
专注于用户阅读体验的响应式博客主题
  1. 首页
  2. 前端
  3. 正文

JS中事件循环(EventLoop)详解

2025年9月14日 244点热度 0人点赞 0条评论

在 JavaScript 中,Event Loop(事件循环) 是一种运行机制,用来协调代码执行、事件处理以及异步任务(如 setTimeout、Promise、async/await)。它的核心作用是保证 非阻塞 的执行方式,使得 JS 虽然是单线程,却能同时处理同步和异步操作。

基本原理

  • 调用栈(Call Stack):JS 中用于保存正在执行的函数。只有栈清空之后,事件循环才会去检查异步任务。
  • 任务队列(Task Queue):异步任务完成后,会把回调函数放置在任务队列,等待执行。
  • 事件循环(Event Loop):不断检查调用栈是否为空,如果为空,就把任务队列中的第一个任务推入调用栈中执行。

宏任务与微任务

事件循环中,任务又分两类:

  • 宏任务(MacroTask):整体的执行块,如 setTimeout、setInterval、setImmediate、I/O、script 整体代码等。
  • 微任务(MicroTask):更细粒度的回调,例如 Promise.then、process.nextTick、queueMicrotask。

事件循环的执行顺序通常是:

  1. 执行一个宏任务(比如整段 script)。
  2. 宏任务执行完毕后,清空所有微任务队列。
  3. 开始下一个宏任务。

执行流程举例

jsconsole.log('1');

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

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

console.log('4');

执行过程:

  1. console.log('1') → 输出 1。
  2. setTimeout 回调(宏任务) → 加入宏任务队列。
  3. Promise.then(微任务) → 加入微任务队列。
  4. console.log('4') → 输出 4。
  5. 清空微任务队列:输出 3。
  6. 开始下一个宏任务:输出 2。

最终输出顺序: 1 → 4 → 3 → 2

JS Event Loop 流程图解

      ┌───────────────────┐
      │   调用栈 (Call Stack) │
      └───────▲───────────┘
              │  (执行中函数)
              │
 ┌────────────┴────────────┐
 │                         │

┌────┴────┐ ┌─────┴─────┐
│ 宏任务队列 │ │ 微任务队列 │
│ (Macrotask)│ │ (Microtask)│
│ setTimeout│ │ Promise.then│
│ setInterval│ │ queueMicrotask│
│ script整体 │ │ process.nextTick│
└────┬────┘ └─────┬─────┘
│ │
└───────────┬─────────────┘
│
┌─────▼─────┐
│ Event Loop│
└─────▲─────┘
│ 不断检查:
│ 1. 栈是否为空?
│ 2. 微任务队列是否需要清空?
│ 3. 再取宏任务进入栈执行。

标签: EventLoop 事件循环 微任务
最后更新:2025年9月14日

skybreak

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2025 年 10 月
  • 2025 年 9 月
  • 2025 年 8 月

分类

  • NAT64
  • VPS测评
  • 前端
  • 前端面试题
  • 华为云考试
  • 教程
  • 未分类
  • 油猴插件
  • 纯IPV6
  • 羊毛

COPYRIGHT © 2025 最初的. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang