首页 > web前端 > js教程 > 正文

如何理解Javascript的宏任务与微任务?

夢幻星辰
发布: 2025-12-16 20:26:02
原创
685人浏览过
宏任务和微任务决定JavaScript事件循环执行顺序:同步代码执行完后先清空所有微任务,再执行下一个宏任务;宏任务包括script、setTimeout、用户事件等,微任务包括Promise.then、queueMicrotask等。

如何理解javascript的宏任务与微任务?

宏任务和微任务是 JavaScript 事件循环里两类不同优先级的异步任务,它们决定了代码实际执行的顺序。简单说:同步代码跑完后,先清空所有微任务,再执行下一个宏任务。

宏任务是“一轮循环的主角”

每次事件循环只取一个宏任务来执行,它是调度的基本单位。常见类型包括:

  • 整体脚本<script></script>标签里的代码本身)
  • setTimeout/setInterval 回调
  • 用户事件(如 click、input)
  • UI 渲染浏览器环境)
  • requestAnimationFrame

宏任务之间互不干扰,每执行完一个,就立刻进入微任务处理阶段。

微任务是“插队的急事”

微任务不参与轮次竞争,而是在当前宏任务结束后、下一个宏任务开始前,一口气全部执行完。常见类型有:

立即学习Java免费学习笔记(深入)”;

  • Promise.then/catch/finally
  • queueMicrotask()(显式添加)
  • MutationObserver 回调

关键点:如果某个微任务里又调用了 Promise.resolve().then()queueMicrotask(),新任务会加入当前微任务队列,继续执行,直到队列彻底为空。

DESTOON B2B网站管理系统
DESTOON B2B网站管理系统

DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。

DESTOON B2B网站管理系统 0
查看详情 DESTOON B2B网站管理系统

执行顺序很固定

一个典型的事件循环步骤是:

  • 运行当前宏任务中的同步代码
  • 遇到 setTimeout → 推入宏任务队列;遇到 Promise.then → 推入微任务队列
  • 同步代码执行完毕,立即执行全部微任务(按加入顺序)
  • 微任务队列清空后,浏览器可能触发渲染(仅限浏览器环境)
  • 从宏任务队列取出下一个任务,重复流程

所以即使 setTimeout(fn, 0)Promise.resolve().then(fn) 同时写,后者一定先执行。

为什么这个区分很重要

它直接影响状态更新时机和 UI 表现。比如:

  • Promise.then 处理数据更新,能确保 DOM 变更在渲染前完成
  • setTimeout 做延迟或任务切片,避免阻塞主线程
  • 误把大量逻辑塞进微任务,可能造成事件循环卡顿(微任务永不中断)

基本上就这些。理解清楚谁先谁后,很多“明明写了却没按预期执行”的问题就迎刃而解了。

以上就是如何理解Javascript的宏任务与微任务?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号