新闻中心

J*aScript事件循环_微任务与宏任务

2025-11-26
浏览次数:
返回列表
J*aScript通过事件循环协调异步操作,宏任务(如setTimeout)执行后会清空微任务队列(如Promise回调),导致微任务优先于下一轮宏任务执行,影响代码执行顺序与性能。

javascript事件循环_微任务与宏任务

J*aScript 是单线程语言,所有任务都在一个主线程上执行。为了协调代码的执行顺序,尤其是异步操作,J*aScript 引入了事件循环(Event Loop)机制。事件循环的核心是管理宏任务(Macrotask)和微任务(Microtask),并决定它们的执行顺序。

宏任务与微任务的区别

在 J*aScript 中,任务分为两类:宏任务和微任务。

宏任务包括:

  • 整体 script 代码
  • setTimeout 回调
  • setInterval 回调
  • I/O 操作
  • UI 渲染

微任务包括:

  • Promise.then/catch/finally 回调
  • MutationObserver 回调
  • queueMicrotask()
  • process.nextTick(Node.js 环境)

关键区别在于:每个宏任务执行完后,会清空当前所有的微任务队列,然后再执行下一个宏任务。

事件循环执行流程

事件循环的工作方式如下:

  1. 从宏任务队列中取出一个任务执行。
  2. 执行过程中遇到微任务,将其加入微任务队列。
  3. 当前宏任务执行完毕后,立即清空微任务队列中的所有任务。
  4. 检查是否有新的宏任务,重复上述过程。

这意味着微任务总是在当前宏任务结束后、下一个宏任务开始前被集中处理。

实际例子说明执行顺序

看下面这段代码:

Kreado AI Kreado AI

Kreado AI是一个多语言AI视频创作平台,只需输入文本或关键词,即可创作真实/虚拟人物的多语言口播视频。 为创作者提供AI赋能

Kreado AI 182 查看详情 Kreado AI console.log('script start'); setTimeout(() => { console.log('setTimeout'); }, 0); Promise.resolve().then(() => { console.log('promise1'); }).then(() => { console.log('promise2'); }); console.log('script end');

输出结果为:

script start script end promise1 promise2 setTimeout

解释:

  • “script start” 和 “script end” 属于同步代码,最先输出。
  • setTimeout 是宏任务,进入宏任务队列等待。
  • Promise 的 then 是微任务,进入微任务队列。
  • 当前 script 宏任务执行完后,清空微任务队列,输出 promise1 和 promise2。
  • 下一轮事件循环取出 setTimeout 回调执行。

注意嵌套与性能影响

微任务会在当前宏任务结束后立即执行,如果在微任务中不断创建新的微任务,会导致微任务队列无法清空,阻塞后续宏任务(如页面渲染),造成界面卡顿。

例如:

let count = 0; function recursivePromise() { Promise.resolve().then(() => { count++; console.log(count); recursivePromise(); }); } recursivePromise();

这会持续占用主线程,相当于“微任务死循环”,应避免此类写法。

基本上就这些。理解宏任务和微任务的执行时机,有助于写出更可靠的异步逻辑,也能更好排查执行顺序问题。

以上就是J*aScript事件循环_微任务与宏任务的详细内容,更多请关注其它相关文章!


# 如何处理  # 开封行业网站建设价格  # 珠海网络营销推广代运维  # 旅游网站怎么做推广营销  # seo推广设计方案分类  # 嘉兴网站优化哪家有实力  # seo基础怎么做  # 小餐饮推广营销  # 益阳网站建设ppt  # seo只要包含  # 黑龙江企业网站建设团队  # 是一个  # 下一轮  # 多语言  # 微任务与宏任务  # 完后  # 是怎样  # 首次  # 清空  # 回调  # 关键词  # 区别  # mac  # node  # node.js  # js  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  163邮箱注册官网 免费申请163个人邮箱  如何在 Excel Online 和 Google 表格中更改日期格式  如何仅使用CSS更改登录界面背景图像图标的颜色  创客贴用户入口官网登录 创客贴网页版电脑版系统  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  优化Log4j2控制台输出性能:解决异步日志瓶颈  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  妖精动漫免费平台 妖精动漫官网资源观看网址  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  c++ 命名空间怎么用 c++ namespace使用指南  学习通网页版快速入口 学习通官网网页版直接打开  J*a应用集成GitHub CLI与API认证指南  Go语言中JSON数据解码与字段访问指南  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  台积电1.4nm工艺A14瞄准2028:10年来性能提升80%  优化Django表单:提交验证失败后保留用户输入  黑猫投诉统一入口官网 消费者权益保护投诉平台  理解Python模块与全局变量的作用域管理  AO3镜像入口大全 AO3网页版内容访问全集  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  qq游戏大厅官方下载_qq游戏免费下载安装入口  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  58动漫网在线官方网 58动漫网正版动漫入口网址  2026春节假期时间安排 2026春节假日查询  MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  抖音从哪里进入网页版_抖音官方入口链接  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  Go语言中动态执行代码字符串的策略与实践  4399体育竞技小游戏_4399小游戏赛事入口  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  12306几点到几点不能订票? | 官方最新系统维护时间全解析  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  AngularJS $http POST请求数据传递与Go后端接收实践  电脑IP地址怎么查 查看本机IP地址的几种方法  京东单号查询入口_京东快递订单追踪入口  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度 

搜索