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

【JavaScript 高级】事件循环机制详解

背景

JavaScript 是一种单线程语言,这意味着它在同一时间只能执行一个任务。然而,JavaScript 通过事件循环机制实现了异步编程,使得它可以处理多个任务,而不会阻塞主线程。

JavaScript 的事件循环(Event Loop)是一种运行机制,用于处理异步任务和事件回调。它基于单线程模型,通过任务队列(Task Queue)和微任务队列(Microtask Queue)来调度任务的执行顺序。

核心概念

(1)调用栈

调用栈是一个后进先出(LIFO)的数据结构,用于跟踪函数的调用顺序。当一个函数被调用时,它会被压入调用栈;当函数执行完毕时,它会被弹出调用栈。

function bar() {console.log('bar');
}function foo() {bar();console.log('foo');
}foo();

在这个例子中,调用栈的变化如下:
foo() 被调用,foo 被压入调用栈。
foo() 中调用 bar(),bar 被压入调用栈。
bar() 执行完毕,bar 被弹出调用栈。
foo() 继续执行,foo 执行完毕后被弹出调用栈。

(2)任务队列

任务队列是一个先进先出(FIFO)的数据结构,用于存储异步任务。当一个异步任务完成时,它会被放入任务队列中,等待事件循环将其放入调用栈中执行。

setTimeout(() => {console.log('setTimeout');
}, 0);console.log('start');

在这个例子中,setTimeout 的回调函数会被放入任务队列中,等待事件循环将其放入调用栈中执行。

任务队列包括宏任务队列和微任务队列:

  • 宏任务:setTimeout/setInterval、DOM操作、I/O、UI渲染、事件回调等
  • 微任务:Promise、MutationObserver、queueMicrotask、process.nextTick(Node.js)。

(3)事件循环

事件循环是一个无限循环,用于监控调用栈和任务队列。当调用栈为空时,事件循环会从任务队列中取出一个任务并将其放入调用栈中执行。

事件循环的执行顺序

  1. 同步任务:直接进入调用栈执行。
  2. 微任务:在每次事件循环的末尾执行。
  3. 宏任务:在事件循环的每个阶段执行。

优先级

同步代码 > 微任务 > 宏任务

注意事项

  • 微任务队列必须清空后才会执行下一个宏任务。
  • 避免在微任务中递归添加微任务,否则会阻塞事件循环。
  • 不同环境(浏览器、Node.js)的事件循环实现可能略有差异。

在这里插入图片描述

相关文章:

  • 如何站在指标体系之巅看智能数据建模产品(GAI)
  • docker常见考点
  • JS入门——JS引入方式
  • 收集飞花令碎片——C语言(数组+函数)
  • 简单三步FastAdmin 开源框架的安装
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Split Landing Page(拆分展示页)
  • 小白畅通Linux之旅-----Linux日志管理
  • 软件无线电技术之基带QPSK 调制技术+扩频技术
  • GB/T 14833-2020 合成材料运动场地面层检测
  • 【2025年电工杯数学建模竞赛A题】光伏电站发电功率日前预测问题+完整思路+paper+源码
  • 德思特新闻 | 德思特与es:saar正式建立合作伙伴关系
  • Vue-Router 基础使用
  • 2.2.1 05年T4
  • 设备制造行业项目管理难点解析,如何有效解决?
  • Vue-05(自定义事件)
  • 【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN
  • wails3学习-打包(wails3 package)
  • Nginx版本平滑迁移方案
  • 26考研 | 王道 | 第六章 应用层
  • 第7讲、Odoo 18 源码深度分析
  • wordpress 主题白屏/搜索引擎的关键词优化
  • 长春网站建设网站制作推广/长沙seo网络优化
  • 鲜花网站建设解决方案/电商运营去哪里学比较好
  • 济南网站开发公司/爱站网 关键词挖掘工具
  • php做网站python做什么/线上营销模式
  • 深圳建西站/温州网站建设