新闻中心
事件循环机制完全解读_微任务与宏任务的执行顺序
J*aScript事件循环中,先执行宏任务,再清空微任务队列。例如:同步代码(宏任务)→ 微任务(如Promise.then)→ 下一个宏任务(如setTimeout)。输出顺序为1→4→3→2,因微任务在当前宏任务后立即执行,而setTimeout属于下一轮宏任务。嵌套微任务也会在本轮处理,如C→A→B所示。掌握此机制对异步编程至关重要。

J*aScript 是单线程语言,所有任务都在一个主线程上执行。为了协调异步操作(如定时器、网络请求、DOM 事件等)的执行,JS 引擎引入了事件循环机制(Event Loop)。理解事件循环的关键在于搞清楚宏任务(Macrotask)和微任务(Microtask)的执行顺序。
什么是宏任务与微任务?
宏任务和微任务是事件循环中两种不同类型的任务队列:
- 宏任务包括:整体代码块、setTimeout、setInterval、I/O 操作、UI 渲染、postMessage、setImmediate(Node.js)等。
- 微任务包括:Promise.then/catch/finally、MutationObserver(浏览器)、process.nextTick(Node.js)、queueMicrotask 等。
每轮事件循环中,JS 引擎会先执行一个宏任务,然后清空当前所有的微任务队列。只有当微任务队列为空时,才会进行下一轮宏任务。
执行顺序规则详解
事件循环遵循以下流程:
- 从宏任务队列中取出第一个任务执行(比如主代码块或 setTimeout 回调)。
- 在该宏任务执行过程中,遇到微任务时,将其加入微任务队列。
- 当前宏任务执行完毕后,立即执行微任务队列中的所有任务,直到队列清空。
- 微任务执行完后,可能触发 UI 渲染(浏览器环境),然后进入下一轮事件循环,取下一个宏任务。
简单说就是:一个宏任务 → 所有微任务 → 下一个宏任务 → 所有微任务……
实际例子解析
来看一段经典代码:
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
Promise.resolve().then(() => {
console.log('3');
});
console.log('4');
输出
顺序是:1 → 4 → 3 → 2
Tunee AI
新一代AI音乐智能体
1104
查看详情
解释:
- '1' 是同步代码,直接输出。
- setTimeout 是宏任务,被放入宏任务队列。
- Promise.then 是微任务,进入微任务队列。
- '4' 是同步代码,接着输出。
- 当前宏任务(主代码块)执行结束,开始执行微任务队列,输出 '3'。
- 微任务清空后,进入下一轮事件循环,执行 setTimeout 回调,输出 '2'。
嵌套情况下的执行顺序
微任务可以继续注册新的微任务,这些都会在本轮宏任务结束后依次执行:
Promise.resolve().then(() => {
console.log('A');
Promise.resolve().then(() => {
console.log('B');
});
});
console.log('C');
输出:C → A → B
因为 'A' 输出后又注册了一个微任务 'B',它仍属于当前宏任务后的微任务阶段,所以会在 'A' 后立即执行,不会等到下一轮宏任务。
基本上就这些。掌握宏任务与微任务的区别以及事件循环的执行节奏,对理解异步编程、避免回调地狱、优化性能都至关重要。不复杂但容易忽略细节。
以上就是事件循环机制完全解读_微任务与宏任务的执行顺序的详细内容,更多请关注其它相关文章!
# 如何使用
# 东莞网站优化联系方式
# 网站优化方案外包
# 网站建设申请模板下载
# 披萨营销推广语言文案
# 呈贡网站seo开发
# 咸宁seo网络推广公司排名
# seo文章撰写技巧
# 东门软件网站建设
# 温州网站建设技术方案
# 沈阳和平网站优化服务商
# 都在
# 偏移量
# 本轮
# javascript
# 至关重要
# 表单
# 回调
# 清空
# 会在
# 下一轮
# 区别
# mac
# 浏览器
# node
# node.js
# js
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Python中高效访问嵌套字典与列表中的键值对
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
照顾宝贝2小游戏免费秒玩入口
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
Tabulator表格日期时间排序问题及自定义解决方案
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】
抖音网页版企业服务中心登录入口_抖音网页版企业登录平台
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】
网易大神账号申诉需要多久_网易大神账号申诉流程说明
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
126邮箱账号注册 电脑版登录入口
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
蛙漫移动版在线看 蛙漫手机浏览器直达入口
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
汽水音乐在线解析 汽水音乐在线解析入口
Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】
Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程
12306选座如何查看座位示意图_12306座位示意图解读与使用
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
拼多多赚钱渠道_拼多多收益来源
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
京东单号查询入口_京东快递订单追踪入口
J*aScript中正确使用querySelectorAll与复杂CSS选择器
淘宝支付提示失败如何解决 淘宝支付流程优化方法
韩小圈电脑版在线入口_网页版免费登录地址
excel怎么制作工资条 excel快速生成工资条的方法
J*aScript Promise链中如何正确终止后续.then执行并处理错误
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
c++中为什么推荐使用using替代typedef_c++现代化类型别名
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
AO3官网镜像链接 Archive of Our Own同人文在线浏览
微信群消息显示延迟如何解决 微信群消息刷新优化方法
Python getattr() 异常处理深度解析:避免程序意外退出
J*aScript中localStorage数据的获取、清洗与格式化教程
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
Flexbox布局实践:实现粘性导航栏与底部固定页脚
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台


2025-12-04
浏览次数:次
返回列表