news 2026/4/3 4:11:40

从执行顺序彻底搞懂 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/3/23 8:39:44

10分钟搭建个人翻译站:GitHub项目一键克隆部署

10分钟搭建个人翻译站:GitHub项目一键克隆部署 🌐 AI 智能中英翻译服务 (WebUI API) 在跨语言交流日益频繁的今天,高质量、低延迟的翻译工具已成为开发者、内容创作者和国际业务人员的刚需。然而,市面上许多翻译服务存在隐私泄…

作者头像 李华
网站建设 2026/3/28 3:10:33

M2FP在零售业的应用:顾客行为分析

M2FP在零售业的应用:顾客行为分析 📌 引言:从人体解析到商业洞察 在智能零售的浪潮中,如何精准理解顾客行为已成为提升门店运营效率和用户体验的关键。传统监控系统仅能提供“谁在什么时间出现在哪里”的基础信息,而现…

作者头像 李华
网站建设 2026/3/24 19:02:59

教育创新实践:中学信息技术课的AI图像生成实验设计

教育创新实践:中学信息技术课的AI图像生成实验设计 作为一名高中信息技术教师,我一直希望将前沿的AI技术引入课堂,让学生亲身体验人工智能的魅力。最近,我设计了一套基于AI图像生成的教学实验方案,特别适合没有GPU设备…

作者头像 李华
网站建设 2026/4/2 2:55:09

多模型竞技场:一键部署Z-Image-Turbo与主流AI绘画模型

多模型竞技场:一键部署Z-Image-Turbo与主流AI绘画模型 作为一名AI技术爱好者,你是否遇到过这样的困扰:想同时比较多个图像生成模型的效果,却发现每个模型的环境配置各不相同,光是安装依赖和解决版本冲突就耗费了大量时…

作者头像 李华
网站建设 2026/3/23 8:28:54

测试报告自动化生成与通知

一、自动化报告与智能通知已成为测试效能的“新基础设施”‌在2026年的软件研发体系中,‌测试报告不再只是结果的静态记录,而是驱动质量决策的动态智能中枢‌。通过“自动化生成 AI洞察 多通道智能通知”的三位一体架构,测试团队可将报告生…

作者头像 李华
网站建设 2026/3/27 13:29:46

M2FP模型在体育分析中的应用:运动员动作分解技术

M2FP模型在体育分析中的应用:运动员动作分解技术 🧩 M2FP 多人人体解析服务简介 在现代体育科学与智能训练系统中,对运动员动作的精细化分析已成为提升竞技表现的关键手段。传统的视频回放和人工标注方式效率低下、主观性强,难以满…

作者头像 李华