JavaScript中的事件循环机制,包括事件循环的原理、宏任务和微任务、事件队列和调用栈、以及如何优化事件循环
JavaScript中的事件循环机制是JavaScript运行引擎的核心之一,它决定了代码的执行方式和效率。本文将从几个方面介绍JavaScript中的事件循环机制,包括事件循环的原理、宏任务和微任务、事件队列和调用栈、以及如何优化事件循环。
一、事件循环的原理
事件循环是JavaScript中实现异步编程的机制之一,它的基本原理是不断地从事件队列中取出事件并执行。JavaScript中的事件分为宏任务和微任务两种类型,宏任务通常包括setTimeout、setInterval、DOM事件等,而微任务包括Promise、MutationObserver等。当一个宏任务执行完成后,会检查是否存在未处理的微任务,如果存在则依次取出执行,直到所有的微任务执行完毕后才继续执行下一个宏任务。
另外,在EventLoop中还有一个概念叫做“任务源”,每个任务源都有一个与之对应的特定任务队列,它们通常由宿主环境提供。例如,浏览器提供了多个任务源,比如Script、Render、User interaction等。这些任务源会将事件推入对应的任务队列,然后在每个事件循环中依次处理。
二、宏任务和微任务
前面已经提到,JavaScript中的事件分为宏任务和微任务两种类型。这里再详细介绍一下它们的执行顺序和使用场景。
- 宏任务
宏任务通常由宿主环境提供,比如setTimeout、setInterval、DOM事件等。在每个事件循环中,只有一个宏任务被执行,其他宏任务需要等待当前宏任务执行完毕后才能继续执行。如果在一个宏任务中产生了新的宏任务,那么它们会被推入到相应的任务队列中,并等待下一个事件循环执行。
- 微任务
微任务通常是由JavaScript引擎提供,比如Promise、MutationObserver等。在每个事件循环中,所有的微任务都会被执行,直到微任务队列为空为止。如果在一个微任务中产生了新的微任务,那么它们会被添加到当前微任务队列的末尾,并在当前微任务队列中的所有任务都被执行后立即执行。
使用场景:对于比较耗时的操作,建议使用宏任务;而对于一些需要尽快执行的操作,比如DOM渲染、界面更新等,建议使用微任务。
三、事件队列和调用栈
事件队列是指存储事件的队列,执行事件循环时可以从队列中取出事件并执行。而调用栈则是记录代码执行过程的数据结构,它用于管理函数的调用关系和执行顺序。当一个函数被调用时,会将该函数的执行上下文添加到调用栈的顶部;当一个函数执行完成后,它的执行上下文会从调用栈中弹出。
在JavaScript中,事件队列和调用栈是相互独立的。每当一个事件被添加到事件队列中时,它会等待调用栈为空后才会被推出并执行。如果事件队列中存在多个事件,则它们会按照添加的顺序依次执行,直到所有事件都被执行完毕。
四、如何优化事件循环
事件循环的性能是影响JavaScript程序整体性能的重要因素之一。为了提高事件循环的效率,我们可以采取以下几种优化措施:
-
尽量使用微任务:由于微任务的执行在当前事件循环中进行,所以可以尽量使用微任务来进行任务分发,避免过多的宏任务产生。
-
减少计算量:多次计算同一个值会造成浪费,所以可以将一些重复计算的值存储起来,以便复用。
-
避免阻塞UI线程:长时间执行的操作会阻塞UI线程,导致页面卡顿,可以考虑将这些耗时操作放到Worker线程中执行。
-
减少DOM操作:对DOM的频繁操作会影响页面渲染效率,可以通过合并多个DOM操作来减少对页面的影响。
总结
本文介绍了JavaScript中的事件循环机制,包括事件循环的原理、宏任务和微任务、事件队列和调用栈,以及如何优化事件循环。了解和掌握这些内容对于编写高性能的JavaScript代码非常重要,希望读者能够通过本文对事件循环机制有更深入的认识和理解。
相关文章:
JavaScript中的事件循环机制,包括事件循环的原理、宏任务和微任务、事件队列和调用栈、以及如何优化事件循环
JavaScript中的事件循环机制是JavaScript运行引擎的核心之一,它决定了代码的执行方式和效率。本文将从几个方面介绍JavaScript中的事件循环机制,包括事件循环的原理、宏任务和微任务、事件队列和调用栈、以及如何优化事件循环。 一、事件循环的原理 事…...
【华为OD机试c++】解压报文【2023 B卷 |200分】
题目描述 为了提升数据传输的效率,会对传输的报文进行压缩处理。 输入一个压缩后的报文,请返回它解压后的原始报文。 压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。 注意 n 为正整数(0 < n < 100&a…...
JS中Array的forEach、map、filter方法区别?
一:基本用法 1、forEach()函数用于对数组中的每个元素执行给定的函数,而它不返回任何值,它只是对每个元素调用传入的函数。这个函数可以接受三个参数:当前元素的值、当前元素的索引和整个数组。 const arr [1, 2, 3]; arr.forE…...

Java的Arrays类的sort()方法(41)
目录 sort()方法 1.sort()方法的格式 2.使用sort()方法时要导入的类 3.作用 4.作用的对象 5.注意 6.代码及结果 (1)代码 (2)结果 sort(&…...

Redis安装及其配置文件修改
一、redis 安装 点击即可下载 https://download.redis.io/releases/ 将下载后的包通过xftp上传到服务器 解压,我这边是解压到/usr/local目录下 -- 创建路径 mkdir /usr/local/redis -- 解压 tar -zxvf redis-4.0.0.tar.gz -C /usr/local/redis 为防止编译失败&am…...

VSOMEIP3抓包数据
环境 $ cat /etc/os-release NAME"Ubuntu" VERSION"20.04.6 LTS (Focal Fossa)" IDubuntu ID_LIKEdebian PRETTY_NAME"Ubuntu 20.04.6 LTS" VERSION_ID"20.04" HOME_URL"https://www.ubuntu.com/" SUPPORT_URL"https:/…...

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程]
基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程] 0. 前言1. 资源信息获取函数——monitor.py2. UI界面——listen.py3. main.py4. 运行效果5. 编译 exe 程序6. 其他PyQt文章 0. 前言 利用 PyQt5 开发一个 windows 的资源监视助手,在使用虚…...

Linus Torvalds发布了第一个Linux内核6.4候选版本
导读自Linux内核6.3发布和下一个内核系列Linux 6.4的合并窗口开放以来,已经过去了一段时间,近日,Linus Torvalds发布了第一个RC(候选发布版)的里程碑,供公众测试。 为期两周的Linux内核6.4合并窗口现已关闭…...

由浅入深Dubbo核心源码剖析环境介绍
目录 1 框架介绍1.1 概述1.2 运行架构1.3 整体设计 2 环境搭建2.1 源码拉取2.2 源码结构2.3 环境导入2.4 测试2.5 管理控制台 1 框架介绍 1.1 概述 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能&#…...
Java 远程连接 SQLite 数据库
Java 可以使用 JDBC API 来连接 SQLite 数据库。但是,SQLite 不支持远程连接,因为它是一种文件数据库,需要直接访问数据库文件。 如果您需要从远程位置访问 SQLite 数据库,可以将 SQLite 数据库文件放在共享文件夹中,…...
网安面试题大全(附答案)
本文面试题汇总: 防范常见的 Web 攻击 重要协议分布层 arp协议的工作原理 rip协议是什么?rip的工作原理 什么是RARP?工作原理 OSPF协议?OSPF的工作原理 TCP与UDP区别总结 什么是三次握手四次挥手? tcp为什么要三次握手…...

windows 系统扩容C盘注意事项
windows系统大家都不陌生,是大家用的最多的操作系统。在实际的使用中,遇到需要扩容C盘的情况不是很多,但是如果遇到了,有以下几个事项需要大家注意: 剩余空间是否充足 不论当前服务器是物理服务器还是虚拟机ÿ…...

接入支付宝沙箱环境
1、这里有几个重要数据要拿到,一个是支付宝的公钥和私钥,一个是支付的网关,和支付的APPID。这几个数据是要写到代码中的 官方手册:文档地址 1.1 配置沙箱应用环境 https://openhome.alipay.com/develop/sandbox/app 1.2 配置接口…...

用原生JS实现虚拟列表(IT枫斗者)
用原生JS实现虚拟列表 介绍 最近在开发需求的时候,有用到 Antd 的虚拟列表组件 rc-virtual-list ,粗略地看了一下源码,于是萌生了自己写一个虚拟列表的想法。当一个列表需要渲染大量数据的时候是非常耗时的,而且在列表滚动的过程…...

FAT NTFS Ext3文件系统有什么区别
10 年前 FAT 文件系统还是常见的格式,而现在 Windows 上主要是 NTFS,Linux 上主要是Ext3、Ext4 文件系统。关于这块知识,一般资料只会从支持的磁盘大小、数据保护、文件名等各种维度帮你比较,但是最本质的内容却被一笔带过。它们最…...
信息收集思路
1、开发者注释 在网站前端代码中遗留的开发者注释 其中可能包含某些关键信息 💡 使用F12 、CtrlU 、view-source: 查看前端源码 3、Robots文件 爬虫协议,网站根目录存在的robots.txt文件,用于告知搜索引擎或爬虫哪些路径和页面不…...

Tauri应用开发(二):创建第一个Tauri应用
创建tauri应用 推荐参考官方文档:https://tauri.app/v1/guides/ 创建命令: npm create tauri-applatest💡注意:请确保Node.js和Rust已经正确安装 在创建过程中,需要根据提示选择配置项。 主要配置有: 项目…...

自信裸辞:一晃 ,失业都3个月了.....
最近,找了很多软测行业的朋友聊天、吃饭 ,了解了一些很意外的现状 。 我一直觉得他们技术非常不错,也走的测开/管理的路径;二三月份裸辞的,然后一直在找工作,现在还没找到工作 。 经过我的分析࿰…...
Python3 输入和输出
在Python 3中,你可以使用内置的函数来进行输入和输出操作。 输入(Input): 要从用户那里获取输入,可以使用input()函数。input()函数会等待用户输入,并返回一个字符串。你可以将输入存储在一个变量中&#…...

Mybatis Plus 使用@TableLogic实现逻辑删除
文章目录 步骤1:修改数据库表添加deleted列步骤2:实体类添加属性步骤3:运行删除方法知识点1:TableLogic 接下来要讲解是删除中比较重要的一个操作,逻辑删除,先来分析下问题: 这是一个员工和其所签的合同表,关系是一个员工可以签多…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...