新闻中心
J*aScript事件循环_宏任务与微任务详解
J*aScript通过事件循环实现异步,宏任务(如setTimeout)执行后清空所有微任务(如Promise.then),再进入下一宏任务,确保微任务优先于渲染执行。

J*aScript 是单线程语言,靠事件循环(Event Loop)实现异步操作的调度。理解宏任务(MacroTask)与微任务(MicroTask)是掌握 J*aScript 异步执行机制的关键。
事件循环的基本流程
J*aScript 引擎在执行代码时,会先运行同步代码,遇到异步任务则将其交给浏览器或 Node.js 环境处理,并注册回调函数。当异步操作完成,回调会被放入任务队列。事件循环不断检查调用栈是否为空,一旦空了,就从任务队列中取出下一个任务执行。
关键点在于:事件循环每次从宏任务队列中取一个任务执行,执行完后,立即清空当前所有的微任务队列,然后再回到宏任务队列取下一个任务。
宏任务(MacroTask)有哪些?
宏任务是事件循环中一次完整的执行单元。每个宏任务执行完毕后,浏览器可以进行渲染更新。
- setTimeout 回调
- setInterval 回调
- I/O 操作
- UI 渲染
- script 标签整体代码(初始同步代码也被视为一个宏任务)
微任务(MicroTask)有哪些?
微任务在当前宏任务执行结束后立即执行,且会全部执行完才继续下一个宏任务。
- Promise.then/catch/finally 回调
- MutationObserver(DOM 变化监听)
- queueMicrotask() API
- process.nextTick()(Node.js 环境,优先级更高)
执行顺序:宏任务 vs 微任务
来看一个经典例子:
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
Promise.resolve().then(() => {
console.log('3');
});
console.
log('4');
输出结果是:1 → 4 → 3 → 2
解释:
- 先执行同步代码:'1' 和 '4'
- 遇到 setTimeout,放入宏任务队列
- 遇到 Promise.then,放入微任务队列
- 当前宏任务结束,检查微任务队列,执行 then 回调输出 '3'
- 进入下一轮事件循环,执行 setTimeout 回调输出 '2'
再看一个复杂一点的例子:
Avatar AI
AI成像模型,可以从你的照片中生成逼真的4K头像
92
查看详情
console.log('start');
setTimeout(() => {
console.log('timeout1');
Promise.resolve().then(() => {
console.log('promise in timeout');
});
}, 0);
Promise.resolve().then(() => {
console.log('promise1');
setTimeout(() => {
console.log('timeout in promise');
}, 0);
});
console.log('end');
输出顺序:start → end → promise1 → timeout1 → promise in timeout → timeout in promise
分析:
- 同步代码输出 start、end
- 微任务:第一个 Promise.then 输出 promise1
- 宏任务队列:第一个 setTimeout 触发,输出 timeout1
- 此时该宏任务内部产生微任务:Promise.then 输出 promise in timeout
- 下一轮宏任务:setTimeout 在 promise 中注册的那个触发
注意:微任务总是在当前宏任务末尾被集中执行,即使它是在 setTimeout 回调中创建的。
常见误区与注意事项
很多人误以为 setTimeout(..., 0) 就是“立刻执行”,其实它只是尽快加入宏任务队列,必须等当前所有同步和微任务完成。
微任务的高优先级意味着滥用 Promise.then 做大量计算可能阻塞渲染,因为浏览器只在宏任务之间重绘页面。
在实际开发中,若想让某些操作延迟到当前所有异步回调之后执行,可以用 queueMicrotask 或 Promise.resolve().then() 包裹。
基本上就这些。搞清楚宏任务和微任务的执行时机,就能准确预测异步代码的输出顺序。不复杂但容易忽略细节。
以上就是J*aScript事件循环_宏任务与微任务详解的详细内容,更多请关注其它相关文章!
# 第一个
# 食品网站建设美丽
# 地区性关键词排名软件
# 信誉好的网络营销推广
# 丰都网站优化推广
# 优化网站哪里下载
# 咸阳营销型网站建设效果
# 品牌营销数据推广
# 酒店年会推广营销话术模板
# 三门峡广告营销推广公司
# 舟山公司网站建设费用
# 下一轮
# 按需
# 清空
# 如何用
# 管理器
# javascript
# 有哪些
# 是在
# 如何使用
# 回调
# 重绘
# 异步任务
# 栈
# mac
# 回调函数
# 浏览器
# node
# node.js
# js
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
12306选座怎么选到临时改签座_12306改签选座策略与步骤
J*aScript实现单选按钮与关联输入框的联动禁用教程
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
响应式图片在网页设计中的正确实现方法
React/Next.js中实现列表项的动态选择与移动
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
创客贴用户入口官网登录 创客贴网页版电脑版系统
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
AO3同人作品网入口 AO3搜索引擎官网永久地址
SteamMachine定价或为699美元 大家想入手吗?
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
Python字典中优雅地迭代剩余元素的方法
Python getattr() 异常处理深度解析:避免程序意外退出
Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】
J*a应用集成GitHub CLI与API认证指南
c++如何使用Meson构建系统_c++比CMake更快的构建工具
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
如何在 Windows 11 中启动游戏手柄设置
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
excel如何生成目录 excel一键生成工作表目录超链接
J*a应用程序首次运行自动创建文件与目录的最佳实践
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
抖音从哪里进入网页版_抖音官方入口链接
C++如何实现单例模式_C++设计模式之线程安全的单例写法
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
如何使用Node.js csv 包按条件移除含空字段的CSV记录
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
在VS Code中配置和运行Dart程序的完整步骤
微信群消息显示延迟如何解决 微信群消息刷新优化方法
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售


2025-11-22
浏览次数:次
返回列表
log('4');