理解JS事件环(Event Loop)

事件环(Event Loop)

任务分类

  • 宏任务

    • 脚本执行(顺序执行)
    • UI 渲染
    • 定时器(setTimeout)
    • HTTP 请求
    • 事件处理
    • MessageChannel
    • setImmediate
  • 微任务

    • Promise.then
    • MutationObserver
    • process.nextTick
    • queueMicrotask

执行顺序

  1. 执行一个宏任务
  2. 清空微任务队列
  3. 重复步骤 1 和 2

微任务与宏任务执行顺序示例

javascript 复制代码
console.log(1);
async function async() {
  console.log(2);
  await console.log(3); // 相当于 Promise.resolve(console.log(3)).then(()=>{console.log(4)})
  console.log(4); // 也会产生一个 then,在之后执行
}
setTimeout(() => {
  console.log(5);
}, 0);
const promise = new Promise((resolve, reject) => {
  console.log(6);
  resolve(7);
});
promise.then((res) => {
  console.log(res);
});
async();
console.log(8);

执行顺序分析

  1. 同步代码执行

    • console.log(1) → 输出 1
    • console.log(6) → 输出 6(Promise 构造函数中的同步代码)
    • console.log(2) → 输出 2(async 函数开始执行)
    • console.log(3) → 输出 3(await 后面的同步代码)
    • console.log(8) → 输出 8
  2. 微任务队列

    • Promise.then 回调(输出 7)
    • async 函数中 await 后的代码(输出 4)
  3. 宏任务队列

    • setTimeout 回调(输出 5)

最终输出顺序

复制代码
1
6
2
3
8
7
4
5

执行过程详解

  1. 首先执行所有同步代码(1, 6, 2, 3, 8)
  2. 然后清空微任务队列:
    • 执行 Promise.then 回调(7)
    • 执行 async 函数中 await 后的代码(4)
  3. 最后执行宏任务队列中的 setTimeout 回调(5)

关键点说明

  • async/await 本质上是 Promise 的语法糖
  • await 后面的代码会被包装成 Promise.then 回调
  • 微任务优先于宏任务执行
  • 同步代码优先于异步代码执行
  • Promise 构造函数中的代码是同步执行的
  • setTimeout 是宏任务,即使延迟时间为 0

其他重要概念

  • requestAnimationFrame:用于优化动画
  • requestIdleCallback:用于空闲时间任务调度
  • 进程间通信(IPC):多进程间通信机制
相关推荐
滕青山3 分钟前
腾讯域名拦截查询 在线工具核心JS实现
前端·javascript·vue.js
Qinana5 分钟前
从 URL 输入到页面展示:一场跨越进程与协议的“装修”大戏
前端·面试·程序员
不会敲代码18 分钟前
从零开始用 TypeScript + React 打造类型安全的 Todo 应用
前端·react.js·typescript
gyx_这个杀手不太冷静17 分钟前
让 AI 替你写代码:OpenCode 完全配置与高效使用手册
前端·ai编程
进击的尘埃21 分钟前
TypeScript 协变与逆变:你的泛型组件 Props 为什么总是类型报错?
javascript
helloweilei22 分钟前
javascript 结构化克隆
javascript·node.js
龙猫不热23 分钟前
从 0 手写 Promise:拆解 Promise 链式调用的实现原理
前端·javascript·面试
Arthur147261228654728 分钟前
跨域方案汇总
前端
风象南1 小时前
纯文本模型竟然也能直接“画图”,而且还很好用
前端·人工智能·后端
IT_陈寒1 小时前
Vite vs Webpack:5个让你的开发效率翻倍的实战对比
前端·人工智能·后端