news 2026/4/22 10:03:46

从执行顺序彻底搞懂 JavaScript 的同步、微任务与宏任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从执行顺序彻底搞懂 JavaScript 的同步、微任务与宏任务

最近在复习 JavaScript 的过程中,我遇到稍微复杂一点的执行顺序题,就开始靠“感觉”判断。我尝试用一段代码,把 JavaScript 的执行顺序一次性讲清楚。

一段代码

asyncfunctionasync1(){console.log('async1')awaitasync2()console.log('async1 end')}asyncfunctionasync2(){console.log('async2')}console.log('script start')setTimeout(()=>{console.log('setTimeout')},0)async1()newPromise((resolve)=>{console.log('promise')resolve()}).then(()=>{console.log('promise then')})console.log('script end')//执行顺序script start async1 async2 promise script end async1 end promise then setTimeout

JavaScript 执行顺序的核心规则

在分析之前,先记住这 4 条规则:

1️⃣ JavaScript 是单线程的

同一时间只做一件事。

2️⃣ 同步代码优先执行

所有同步代码直接进入调用栈(Call Stack)。

3️⃣ 微任务优先于宏任务

每一轮事件循环中:

先清空所有微任务,再执行一个宏任务

4️⃣ async / await 的本质是 Promise

awaitfn()

等价于:

Promise.resolve(fn()).then(()=>{// await 后的代码})

逐步拆解执行过程

① 执行同步代码(主线程)

console.log('script start')

输出:

script start

② 注册 setTimeout(宏任务)

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

这里只是注册,不会立刻执行。

setTimeout 是宏任务(Macro Task),JavaScript 的执行环境中有 调用栈 + 任务队列,setTimeout注册的回调会进入 宏任务队列,等待当前同步代码和所有微任务执行完,0 毫秒只是最短延迟,不是立即执行。浏览器有最小时间限制(HTML5标准规定至少 4ms),Node.js 也会将其加入事件循环的下一个 tick所以 setTimeout(fn, 0) 表示:“尽快在当前事件循环结束后执行 fn”,但绝不是同步立即执行。

③ 执行 async1()

console.log('async1')

输出:

async1

④ 遇到 await async2()

console.log('async2')

输出:

async2

注意:

  • async2()本身是同步执行的
  • await后面的代码被放入微任务队列

⑤ Promise 构造函数是同步的

console.log('promise')

输出:

promise

⚠️ 很多人误以为 Promise “一创建就是异步”,这是常见误区。

⑥ 继续执行同步代码

console.log('script end')

输出:

script end

开始清空微任务队列

此时微任务队列中有两个任务:

  1. await后的async1 end
  2. promise.then

按进入顺序执行:

console.log('async1 end')
console.log('promise then')

输出:

async1 end promise then

最后执行宏任务

console.log('setTimeout')

输出:

setTimeout

一张执行顺序模型表

同步代码 ↓ 微任务(全部清空) ↓ 宏任务(执行一个) ↓ 微任务(再清空) ↓ 下一轮事件循环
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 2:35:11

Z-Image-Turbo性能对比:如何快速搭建多GPU测试平台

Z-Image-Turbo性能对比:如何快速搭建多GPU测试平台 为什么需要多GPU测试环境 作为技术主管,评估AI模型在不同硬件配置下的性能是日常工作的重要部分。Z-Image-Turbo作为新一代图像生成模型,其创新的8步蒸馏技术实现了4倍速度提升,…

作者头像 李华
网站建设 2026/4/17 14:20:50

毕业设计救星:用预装镜像快速搭建二次元头像生成系统

毕业设计救星:用预装镜像快速搭建二次元头像生成系统 作为一名数字媒体专业的学生,你是否正在为毕业设计发愁?特别是当实验室GPU资源紧张,而你又需要在短时间内完成一个基于GAN模型的二次元头像生成系统时,这种焦虑感可…

作者头像 李华
网站建设 2026/4/18 23:38:54

如何用M2FP实现跨平台人体解析服务

如何用M2FP实现跨平台人体解析服务 🧩 M2FP 多人人体解析服务:从模型到可视化的完整解决方案 在计算机视觉领域,人体解析(Human Parsing) 是一项关键的细粒度语义分割任务,旨在将图像中的人体分解为多个语…

作者头像 李华
网站建设 2026/4/17 1:42:21

AI绘画工作坊:用云端GPU带学员快速体验Stable Diffusion变体

AI绘画工作坊:用云端GPU带学员快速体验Stable Diffusion变体 作为一名技术讲师,我最近在筹备AI艺术创作课程时遇到了一个棘手问题:学员们的设备性能差异太大,有的用高端显卡,有的只有集成显卡,甚至还有人用…

作者头像 李华
网站建设 2026/4/18 15:11:46

揭秘M2FP模型:为什么它能精准识别身体部位?

揭秘M2FP模型:为什么它能精准识别身体部位? 🧩 M2FP 多人人体解析服务 在计算机视觉领域,人体解析(Human Parsing) 是一项极具挑战性的任务——不仅要检测图像中的人体位置,还需将每个像素精确归…

作者头像 李华