news 2026/4/18 12:55:43

从执行顺序彻底搞懂 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/18 10:38:11

大模型翻译效果差?专注中英任务的CSANMT为何更精准

大模型翻译效果差?专注中英任务的CSANMT为何更精准 🌐 AI 智能中英翻译服务 (WebUI API) 在当前多语言交流日益频繁的背景下,高质量的机器翻译已成为企业出海、学术研究与日常沟通的重要工具。然而,许多通用大模型在中英互译任…

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

M2FP模型负载均衡策略

M2FP模型负载均衡策略:高并发场景下的多人人体解析服务优化实践 📌 引言:从单实例到高并发的工程挑战 随着AI视觉应用在社交娱乐、虚拟试衣、智能安防等领域的快速落地,多人人体解析(Multi-person Human Parsing&#…

作者头像 李华
网站建设 2026/4/18 9:24:44

AI绘画工作流优化:将Z-Image-Turbo集成到Photoshop插件

AI绘画工作流优化:将Z-Image-Turbo集成到Photoshop插件 作为一名平面设计师,你是否厌倦了在Photoshop和AI绘画工具之间反复切换?Z-Image-Turbo作为一款高性能文生图模型,现在可以通过插件形式直接嵌入Photoshop工作环境&#xff0…

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

节日营销利器:用Z-Image-Turbo快速生成千人千面的节日祝福图

节日营销利器:用Z-Image-Turbo快速生成千人千面的节日祝福图 每逢佳节,市场营销团队总是面临一个共同的挑战:如何在短时间内为大量用户生成个性化的节日祝福图?传统设计方式不仅耗时耗力,还难以满足大规模定制需求。今…

作者头像 李华
网站建设 2026/4/18 19:25:58

前端开发者跨界AI:无需Python基础玩转图像生成API

前端开发者跨界AI:无需Python基础玩转图像生成API 作为一名JavaScript工程师,你是否曾想为个人网站添加炫酷的AI绘图功能,却被Python环境配置和模型部署流程劝退?本文将介绍如何通过预置镜像快速搭建"黑箱式"图像生成A…

作者头像 李华
网站建设 2026/4/18 12:17:37

M2FP vs 传统分割模型:在人体解析任务上的对决

M2FP vs 传统分割模型:在人体解析任务上的对决 📖 背景与挑战:人体解析为何需要更先进的模型? 人体解析(Human Parsing)是计算机视觉中一项细粒度的语义分割任务,目标是将图像中的人体分解为多个…

作者头像 李华