当前位置: 首页 > news >正文

理解 JS 事件循环:同步代码、微任务、异步任务 Vue computed/watch/nextTick 执行时机

一、前言

你将从本文了解到代码的执行时机,以及拓展Vue下computed / watch / nextTick执行时机的差异。


二、执行时机

1. JS 事件循环

JavaScript 是单线程语言,所有代码依靠事件循环 EventLoop调度执行,执行优先级严格固定:同步代码 > 微任务 > 异步任务

2. 同步代码

按照书写顺序从上到下依次执行,阻塞后续所有任务普通变量赋值、函数调用、逻辑运算、循环判断都属于同步代码只有当前执行栈所有同步代码全部执行完毕,才会进入微任务队列。

3. 微任务

同步执行栈清空后,会一次性清空当前微任务队列中的全部任务。

值得注意的是Promise的哪一部分是微任务,因为这里总有人会混淆。Promise构造函数内部的执行器代码,全部为同步代码,创建实例时就会立即从上至下执行,不存在异步延迟。只有当内部执resolve()或者reject(),修改 Promise 状态之后,后续链式调用的.then、.catch、.finally回调函数,才会被浏览器推入微任务队列排队等待。

console.log("开始"); new Promise((resolve, reject) => { console.log("Promise 构造函数内部代码"); resolve(); // 修改状态 }); .then(() => { console.log("Promise.then 微任务回调"); }) console.log("结束");

3. 异步任务

优先级最低,其会先交由浏览器后台线程进行监听与处理,不会阻塞主线程。

回调函数的执行时机,必须等待同步 + 当前微任务队列中的全部任务执行完成。

这也就是setTimeout即使设置为0秒,也无法同步执行的原因。

console.log('1 同步代码开始'); setTimeout(() => { console.log('2 setTimeout'); }, 0); console.log('3 同步代码结束');

三、Computed / Watch / NextTick

1. 三者各自的定义

computed属于同步执行,既不是微任务,也不是异步任务。执行时机早于 watch、早于 nextTick、早于 DOM 更新。

watch 默认运行在微任务阶段,本身不属于原生 JS 微任务,watch 跟随 Vue 异步更新调度,执行时序等价微任务

nextTick 底层基于 Promise 封装,是标准微任务。

2. 为什么 watch 执行时机和微任务一致,但它不是原生微任务?

Vue 为了批量更新、减少重复渲染,会把数据变更触发的 watch、组件更新等逻辑,统一收集到内部调度队列。Vue 会借助原生微任务去做整体队列刷新,但 watch 本身只是队列里的普通回调,不是独立的原生微任务

Vue 选择在浏览器微任务阶段统一刷新自身队列,所以 watch 看着和微任务一起执行、时序完全一致。


四、总结

只有理解好代码的执行时机,才能在复杂项目中高效修复 bug、顺畅调整需求。

因为复杂项目中,往往存在大量同步逻辑、异步操作与 Vue 响应式 API 交织,比如数据变更后DOM 未及时更新watch 回调执行时机偏差导致的数据错乱、微任务与异步任务顺序颠倒引发的交互异常等问题,只有精准掌握执行时机,才能快速定位问题根源,避免逻辑混乱,确保代码执行符合预期。

http://www.jsqmd.com/news/699958/

相关文章:

  • FanControl深度技术解析:基于插件架构的Windows散热控制系统优化方案
  • 7种配色+百变空间+全系ADS 4.1:问界M6的“新锐”不止一面
  • 2026年3月市场上粉盒商家,办公用纸/色带/办公耗材/彩色打印机墨盒/碳粉/墨盒/彩色墨盒,粉盒服务商口碑推荐 - 品牌推荐师
  • Phi-3.5-mini-instruct快速上手:无需root权限,在普通用户目录完成全部部署
  • AI代理模型在CAE仿真中的革命性应用
  • 保姆级教程:用树莓派4B+PCF8591模块DIY一个烟雾报警器(附完整C代码)
  • HX711数据不稳定问题
  • RAGAs与G-Eval:AI智能体评估实战指南
  • 职场效率提升:OpenClaw 电脑自动化办公部署教程
  • OpenPLC Editor:开源工业自动化开发的终极指南
  • 如何永久备份微信聊天记录?免费工具WeChatMsg完整指南
  • Windows 一键自动加入企业 AD 域的批处理脚本
  • 算法总结:图论——拓扑序
  • 30岁Java程序员裸辞All in AI,一年后我成了年薪百万的AI应用开发工程师!
  • Windhawk完全指南:免费开源Windows系统个性化定制神器终极教程
  • 30天快速上手Python-02 Python原生数据结构-2 列表List[]
  • API 批量纯代付接口
  • Switch大气层整合包终极指南:从破解到精通,完整解锁你的游戏主机
  • 如何在5分钟内用kohya_ss轻松训练你的AI绘画模型
  • 04-08-10 结论与总结 (Conclusion)
  • DeepSeek V4正式发布,昇腾超节点系列产品全面支持
  • VSCode多Agent调试崩溃频发?资深架构师紧急披露6个隐藏配置陷阱(含vscode-insiders验证数据)
  • 如何用“五维成熟度”量化品牌资产?专知智库新模型给CTO们一个技术解法
  • 基于Spring框架的银行转账业务,通过XML配置方式实现事务管理
  • 五一出游户外徒步必备:开源生存工具Trail Sense完全指南
  • 告别R-CNN的龟速:用Fast R-CNN实现目标检测的‘一键加速’(附VGG16实战对比)
  • Bridging Human Evaluation to Infrared and Visible Image Fusion
  • OOM Killer 选中你的进程只用了 0.3 毫秒——追踪 oom_badness() 的打分公式和 5 个可调旋钮
  • 5分钟掌握B站视频下载:BilibiliDown终极免费工具使用指南
  • 光伏四可装置设备性能评估:光伏组件衰减率与逆变器效率监测