彻底搞懂 Event Loop!一次性吃透宏任务、微任务、执行顺序

Event Loop(事件循环)是 JavaScript 执行机制里的核心知识点。不管是前端面试还是日常开发,只要涉及异步操作,就绕不开它。

这篇文章不玩高深术语,用一套真实示例,带你搞懂:

  • 同步任务、宏任务、微任务到底是什么
  • 它们的执行顺序和优先级
  • 特别提醒:Promise.resolve().then()到底哪个才是微任务?

🧵 为什么需要 Event Loop?

JS 是单线程语言,意味着同一时刻只能执行一件事。

比如执行以下同步代码:

console.log('A');console.log('B');console.log('C');

执行结果必然是:

ABC

这就是同步任务的特点:顺序执行,只有前一个任务执行完毕,才会执行下一个任务。

但在实际开发中,我们经常会遇到网络请求、定时器等耗时任务。如果这些任务都采用同步执行的方式,页面会被卡住,用户体验极差。

为了解决这个问题,浏览器和 Node.js 设计了“异步队列 + Event Loop”的机制:先把耗时的异步任务挂起,等同步任务执行完毕、主线程空闲时,再回头执行异步队列里的任务。

🗂️ 同步任务、宏任务、微任务,怎么分?

三者分类对比表

类型代表示例
同步任务普通函数、console.log、直接调用的函数
宏任务(Macrotask)整个<script>文件、setTimeoutsetIntervalsetImmediateMessageChannel(浏览器)、I/O(Node.js)
微任务(Microtask)Promise.then()MutationObserverqueueMicrotaskprocess.nextTick(Node.js 专属)

核心执行顺序口诀

一个宏任务 → 执行同步任务 → 清空微任务队列 → 执行下一个宏任务 → 循环往复

✅ 浏览器执行顺序经典示例

来看一个典型的混合任务示例,理解执行顺序:

console.log('代码开始');setTimeout(()=>{console.log('这是 setTimeout 回调');},0);Promise.resolve().then(()=>{console.log('这是 promise 的回调');});console.log('代码结束');

🧐 输出结果

代码开始 代码结束 这是 promise 的回调 这是 setTimeout 回调

执行过程拆解

  1. 整个<script>文件作为第一个宏任务,首先执行其中的同步代码:先输出代码开始,再输出代码结束
  2. setTimeout属于宏任务,会被放入宏任务队列,等待下一轮 Event Loop 执行;
  3. Promise.then()属于微任务,会被放入微任务队列,在当前宏任务的同步代码执行完毕后立刻执行;
  4. 当前宏任务的同步代码执行完后,清空微任务队列,执行Promise.then()的回调,输出这是 promise 的回调
  5. 微任务队列清空后,执行下一个宏任务(即setTimeout的回调),输出这是 setTimeout 回调

核心结论:同步任务 → 微任务 → 下一个宏任务

❗ 重点误区:Promise.resolve()本身不是微任务!

很多人会误以为Promise.resolve()本身是微任务,但实际并非如此!真正的微任务是.then()中的回调函数。

来看这个验证示例:

console.log('程序启动');constp1=Promise.resolve('第一个 Promise');constp2=Promise.resolve('第二个 Promise');constp3=newPromise(resolve=>{console.log('执行 p3 构造函数');resolve('第三个 Promise');});p1.then(value=>console.log(value));p2.then(value=>console.log(value));p3.then(value=>console.log(value));setTimeout(()=>{console.log('第一波 setTimeout');constp4=Promise.resolve('第四个 Promise');p4.then(value=>console.log(value));},0);setTimeout(()=>{console.log('第二波 setTimeout');},0);console.log('程序结束');

🧐 输出结果

程序启动 执行 p3 构造函数 程序结束 第一个 Promise 第二个 Promise 第三个 Promise 第一波 setTimeout 第四个 Promise 第二波 setTimeout

🔑 原因解析

  1. Promise.resolve()的作用只是返回一个状态已确定的 Promise 实例,这个过程本身不会产生微任务;
  2. 只有调用.then()方法时,传入的回调函数才会被加入微任务队列;
  3. 执行流程拆解:
    • 先执行所有同步任务:程序启动执行 p3 构造函数(Promise 构造函数内的代码是同步执行的)→程序结束
    • 当前宏任务的同步代码执行完后,清空微任务队列:依次执行 p1、p2、p3 的.then()回调,输出对应的内容;
    • 微任务队列清空后,执行下一个宏任务(第一个setTimeout):输出第一波 setTimeout,其中的p4.then()被加入微任务队列,立刻执行并输出第四个 Promise
    • 最后执行第二个setTimeout宏任务,输出第二波 setTimeout

🧬 MutationObserver:监听 DOM 改变的微任务

在浏览器中,MutationObserver也是微任务的一种,它的作用是监听 DOM 元素的变化,当 DOM 发生指定变化时,回调函数会被加入微任务队列。

示例代码:

consttarget=document.createElement('div');document.body.appendChild(target);constobserver=newMutationObserver(()=>{console.log('微任务: MutationObserver 回调执行');});// 配置监听:监听属性变化和子元素变化observer.observe(target,{attributes:true,childList:true});// 修改 DOM,触发监听target.setAttribute('data-role','123');target.appendChild(document.createElement('span'));

执行结果

微任务: MutationObserver 回调执行

解析:修改 DOM 的操作是同步任务,执行完毕后,MutationObserver的回调会被加入微任务队列,在当前宏任务执行完后立刻执行。

⚡ Node.js 专属:process.nextTick优先级最高的微任务

在 Node.js 环境中,有一个专属的微任务process.nextTick,它的优先级比普通微任务(如Promise.then())更高——在当前宏任务的同步代码执行完后,会先执行所有process.nextTick的回调,再执行其他微任务。

示例代码:

console.log('启动');process.nextTick(()=>{console.log('执行 process.nextTick');});Promise.resolve().then(()=>{console.log('执行 Promise.then');});setTimeout(()=>{console.log('执行 setTimeout');Promise.resolve().then(()=>{console.log('setTimeout 中的 Promise');});},0);console.log('收尾');

🧐 输出结果

启动 收尾 执行 process.nextTick 执行 Promise.then 执行 setTimeout setTimeout 中的 Promise

✏️ queueMicrotask:手动添加微任务

如果需要手动将一个任务加入微任务队列,可以使用queueMicrotask方法,它的效果和Promise.then()一致,都会在当前宏任务执行完后立刻执行。

示例代码:

console.log('准备执行');queueMicrotask(()=>{console.log('这是 queueMicrotask 回调');});console.log('执行完同步任务');

输出结果

准备执行 执行完同步任务 这是 queueMicrotask 回调

🗂️ 最终总结:执行优先级表格

优先级队列内容
🥇 最高process.nextTick(Node.js 专属)
🥈 第二Promise.then()MutationObserver(浏览器)、queueMicrotask
🥉 最后宏任务:setTimeoutsetIntervalI/O(Node.js)、MessageChannel(浏览器)等

核心执行流程

当前宏任务执行完毕 → 清空所有微任务(按优先级执行)→ 执行下一个宏任务 → 循环往复

🚀 最后的金句

Promise.resolve()只是创建了一个已确定状态的 Promise 实例,本身不是微任务!只有调用.then()后,传入的回调函数才会被排进微任务队列!

面试中的异步顺序题,核心考点就在这里,千万别搞混啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI跨文化陪练系统:用技术破解“语言通而心意阻”

和海外客户谈判时&#xff0c;一句“再考虑”被误解为拒绝&#xff1b;向异国朋友问候&#xff0c;却因语气不当显得冒犯——这种“语言过关、文化翻车”的场景&#xff0c;正是AI跨文化能力陪练系统要解决的核心问题。它不止是翻译工具&#xff0c;更是靠技术复刻真实跨文化场…

AI正在占领你的视频推荐流

你的视频推荐流&#xff0c;正在被AI“吞噬”。 这不是危言耸听&#xff0c;正经新调查发现&#xff1a; YouTube算法向新用户展示的视频中&#xff0c;有超过20%的内容是AI制造的低质量视频。 再扎心点说就是&#xff0c;我们平时在YouTube刷到的每5条视频中&#xff0c;可…

深度学习毕设项目推荐-基于python-CNN的常见鱼类分类识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

docker 部署 Prompt Optimizer (提示词优化器)

Prompt Optimizer (提示词优化器) &#x1f680; 在线体验 | 快速开始 | 常见问题 | 开发文档 | Vercel部署指南 | Chrome插件 &#x1f4d6; 项目简介 Prompt Optimizer是一个强大的AI提示词优化工具&#xff0c;帮助你编写更好的AI提示词&#xff0c;提升AI输出质量。支持…

2026 年观察名单:基于 a16z「重大构想」,详解稳定币、RWA 及 AI Agent 等 8 大流行趋势

撰文&#xff1a;Stacy Muur编译&#xff1a;Glendon&#xff0c;Techub News基于 a16z 的「重大构想」&#xff0c;本文分析了 2026 年 8 个主要流行趋势的获胜方向和观察名单。支付、稳定币和金融轨道的重塑论点&#xff1a;稳定币将成为互联网的结算层&#xff0c;而不仅仅是…

深度学习毕设选题推荐:基于人工智能卷积神经网络的海洋生物识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

导师推荐2026最新AI论文平台TOP10:本科生毕业论文必备测评

导师推荐2026最新AI论文平台TOP10&#xff1a;本科生毕业论文必备测评 2026年AI论文平台测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术在学术领域的深入应用&#xff0c;越来越多的本科生开始依赖AI写作工具辅助论文撰写。然而&#xff0c;面对市场上五花八门…

一文带你快速了解大模型量化

一、什么是大模型量化&#xff1f; 简单来说&#xff0c;量化的核心是“精度转换”&#xff1a;把大模型中原本用高精度格式存储和计算的数据&#xff08;比如FP32、FP16&#xff0c;也就是32位、16位浮点数&#xff09;&#xff0c;转换为低精度格式&#xff08;比如INT8、INT…

AI智能戒指问世,可录制会议并生成转录

智能戒指通常用于追踪健康和健身数据&#xff0c;但如果你的戒指还能录制工作会议会怎样&#xff1f;在CES 2026展会上&#xff0c;Vocci AI推出的智能戒指外观与普通智能戒指无异&#xff0c;但其设计目标是融入职业生活而非个人生活。值得注意的是&#xff0c;Vocci戒指并非始…

深度学习毕设项目推荐-基于python卷积神经网络的海洋生物识别深度学习

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

SQL常用语句大全

SQL 常用语句大全&#xff08;通用版&#xff0c;适用于 MySQL、PostgreSQL、SQL Server、Oracle 等&#xff09; SQL&#xff08;Structured Query Language&#xff09;分为几大类&#xff1a;DDL&#xff08;数据定义&#xff09;、DML&#xff08;数据操作&#xff09;、D…

AI编程助手VS Stack Overflow:谁才是程序员的真救星?从救命稻草到凉凉,小白程序员的春天来了?

比诞生之初还冷清&#xff0c;Stack Overflow彻底凉透了&#xff01; 当初的程序员问答圣地&#xff0c;现在的提问数量甚至比18年前上线首月时的问题数量还要少。 &#xff08;这个下降趋势好像来时路……&#xff09; 全球开发者数量翻了好几倍&#xff0c;工具和语言层出不…

Plaud为NotePin添加实体按键升级版本

Plaud更新了其紧凑型NotePin AI录音设备。全新的NotePin S几乎与原版相同&#xff0c;但有一个重大区别&#xff1a;增加了实体按键。同时&#xff0c;Plaud还推出了新的桌面应用程序&#xff0c;用于录制在线会议音频&#xff0c;对所有Plaud Note或NotePin用户免费开放。Note…

2026年13个意外的技术变革预测

超越热门话题&#xff0c;一系列更为隐秘的力量正在后台默默运作&#xff0c;悄然重塑着权力格局、风险环境和经济结构。在即将到来的一年中&#xff0c;低质量的"工作垃圾内容"将悄无声息地涌入各类组织&#xff0c;网络犯罪将发展成为跨国特许经营模式&#xff0c;…

HTML实用的网页代码大全

HTML 实用网页代码大全&#xff08;2025-2026 常用片段精选&#xff09; 以下整理了前端开发中最常用、最实用的 HTML 代码片段&#xff0c;涵盖基础结构、SEO、响应式、表单、媒体、多功能组件等。代码均基于 HTML5 标准&#xff0c;兼容现代浏览器&#xff0c;可直接复制使用…

零标注!强化学习RAG让大模型在工业故障诊断中HitRate飙升93%,比老师傅还准!小白也能上手的工业AI黑科技

工业现场最怕“低频故障”&#xff1a;一年才出两三回&#xff0c;回回都是新症状。 用 ChatGPT 直接问&#xff1f;它只会给你“通用答案”。 用传统 RAG&#xff1f;先请老师傅把 10 年维修记录“标注”一遍&#xff0c;成本直接劝退。 中南大学哈工大团队最新发表在《Adv…

CIO们为2026年制定的9个IT目标决议

首席信息官们正在为新的一年制定大胆的目标决议——这些愿景和计划旨在改变他们的组织并展示IT为企业带来的价值。毫不意外&#xff0c;许多CIO列出的目标都与人工智能相关。但AI并不是CIO们在制定2026年目标时唯一考虑的话题。为了了解IT领导者想要实现的目标&#xff0c;我们…

LLM(大语言模型)到底是怎么工作的?(初学者必看)

前言 如果你经常用聊天机器人问问题、让AI写文案&#xff0c;或是用代码助手辅助编程&#xff0c;其实都是在和LLM&#xff08;大语言模型&#xff09;打交道。这些模型能像“懂人话”一样回应我们的需求&#xff0c;甚至写出逻辑通顺的文章、解决专业问题&#xff0c;但它们背…

a标签中的javascript:;是什么

a标签中的 javascript:; 是什么意思&#xff1f; 在 HTML 中&#xff0c;你经常会看到这样的代码&#xff1a; <a href"javascript:;">点击我</a>或者 <a href"javascript:void(0);">点击我</a>这里的 javascript:; 是一种伪协…

LeCun预言成真?这有一份通往AGI的硬核路线图:从BERT到Genie,在掩码范式的视角下一步步构建真正的世界模型

从OpenAI的Sora到Google DeepMind的Genie&#xff0c;2025年无疑是世界模型*&#xff08;World Model&#xff09;*的爆发之年。 然而&#xff0c;繁荣的背后是概念的混战&#xff1a;世界模型究竟是什么&#xff1f;是强化学习里用来训练Agent的环境模拟器&#xff1f;是看过…