事件循环(eventloop)

浏览器的事件循环(Event Loop)是 JavaScript 执行模型的一部分,它负责协调异步任务的执行顺序。理解事件循环可以帮助我们更好地掌握 JavaScript 的异步机制,尤其是在处理如用户输入、定时器、网络请求等事件时。

  1. 基本概念:
    事件循环是一个不断运行的循环,它检查是否有待处理的任务,并按顺序执行它们。事件循环的目的是确保 JavaScript 引擎能够以非阻塞的方式处理事件和异步操作。

  2. 执行栈(Call Stack):
    执行栈是一个栈结构,用来存储当前正在执行的代码。当执行一个函数时,它会被压入栈中;执行完毕后会被弹出栈。

  3. 任务队列(Task Queue):
    任务队列(也叫消息队列)是一个存放待执行任务的队列。当异步任务(如 setTimeout, 网络请求等)完成后,它们的回调函数会被推入任务队列,等待主线程空闲时执行。

  4. 事件循环的过程:
    执行栈为空: 事件循环首先检查执行栈,如果栈为空,它就会从任务队列中取出一个任务。
    执行任务: 取出的任务被压入执行栈,开始执行。
    完成任务: 执行完当前任务后,事件循环会再次检查执行栈是否为空,若为空则从任务队列中取出下一个任务执行。
    重复: 这一过程会不断重复,确保异步任务能够在合适的时机得到执行。

  5. 宏任务与微任务:
    在事件循环中,任务队列被分为两种类型:宏任务和微任务。

宏任务(Macro Tasks):

包括 setTimeout、setInterval、I/O 操作、UI 渲染等。
每一轮事件循环中,都会先执行完一个宏任务队列中的所有任务,然后才会去执行微任务队列中的任务。
微任务(Micro Tasks):

包括 Promise 的 then 和 catch 回调、MutationObserver 等。
微任务的优先级比宏任务高,它们会在当前宏任务执行完后,执行完所有微任务队列中的任务后,再去执行下一个宏任务。
6. 执行流程:
执行栈为空时,事件循环开始。
从宏任务队列中取出第一个任务,压入执行栈中执行。
执行完宏任务后,检查微任务队列。
如果微任务队列中有任务,按照顺序依次执行微任务。
微任务队列执行完后,事件循环继续从宏任务队列中取出下一个任务。
7. 示例代码:

console.log("Start");setTimeout(() => {console.log("SetTimeout 1");
}, 0);Promise.resolve().then(() => {console.log("Promise 1");
});setTimeout(() => {console.log("SetTimeout 2");
}, 0);console.log("End");

执行顺序:

执行同步代码,先打印 “Start”。
遇到 setTimeout 和 Promise,将它们的回调分别加入宏任务队列和微任务队列。
执行完同步代码后,打印 “End”。
事件循环会先执行所有微任务(Promise 1),然后执行宏任务队列中的任务(SetTimeout 1 和 SetTimeout 2)。
输出结果:

Start
End
Promise 1
SetTimeout 1
SetTimeout 2
  1. 总结:
    执行栈 负责执行当前同步代码。
    任务队列 存放异步任务的回调函数,按顺序执行。
    事件循环 保证了异步任务按照正确的顺序执行,先执行所有的微任务,再执行宏任务。
    微任务的优先级高于宏任务,这也是为什么在上面的例子中 Promise 1 会先被打印出来。
    理解事件循环能够帮助你更好地理解 JavaScript 中的异步编程和如何避免一些常见的陷阱,比如任务队列的执行顺序、微任务与宏任务的执行顺序等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/36473.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

3D 生成重建020-Gaussian Grouping在场景中分割并编辑一切

3D 生成重建020-Gaussian Grouping在场景中分割并编辑一切 文章目录 0 论文工作1 方法2 实验结果 0 论文工作 最近提出的高斯Splatting方法实现了高质量的实时三维场景新视角合成。然而,它仅仅关注外观和几何建模,缺乏细粒度的物体级场景理解。为了解决…

Milvus向量数据库03-搜索理论

Milvus向量数据库03-搜索理论 1-ANN搜索 通过 k-最近邻(kNN)搜索可以找到一个查询向量的 k 个最近向量。kNN 算法将查询向量与向量空间中的每个向量进行比较,直到出现 k 个完全匹配的结果。尽管 kNN 搜索可以确保准确性,但十分耗…

Error relaunching VirtualBox VM process: 5 启动虚拟机时发生了错误

出现错误 一大早起来发现虚拟机打不开,看了虚拟机日志是正常的,还回了个档都不行。 最后我突然想起之前在哪看到过:“完美游戏平台会导致虚拟机的问题。” 解决方法 于是我把完美游戏卸载了,发现,真的&#xf…

基于Springboot的校园交友网站设计与实现

1.1 管理信息系统概述 管理信息系统是计算机在信息管理领域的一种实用技术。通过运用管理科学、数学和计算机应用的原理及方法,在符合软件工程规范的原则下,形成一套完整的理论和方法体系。是一个以人、计算机和其他外部设备组成的可以进行信息的收集、…

FinalShell找不到窗口问题

原因可能Java程序可能记住了之前的窗口位置 笔记本外接了4K显示器,但是在打开一个用Java写的桌面应用FinalShell时候,经常找不到窗口 1. winTab键,选中FinalShell 也可以直接点一下 聚焦 2.按AltSpace(空格) 放大之后 拖下就好了

重生之我在异世界学编程之C语言:深入结构体篇(下)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言结构体的自引用实现链表一、链表的基…

linux学习day03_linux文件与目录管理

1、相对路径和绝对路径的区别 绝对路径:路径的写法“一定由根目录 / 写起”,例如: /usr/share/doc 这个目录。 相对路径:路径的写法“不是由 / 写起”,例如由 /usr/share/doc 要到 /usr/share/man 下面 时&#xff0…

深入浅出:Gin框架中的测试与Mock

深入浅出:Gin框架中的测试与Mock 引言 在现代软件开发中,编写高质量的代码离不开有效的测试。对于Web应用程序来说,单元测试、集成测试和端到端测试都是确保系统稳定性和可靠性的重要手段。本文将带你深入了解如何在Gin框架中进行测试&…

未来网络技术的新征程:5G、物联网与边缘计算(10/10)

一、5G 网络:引领未来通信新潮流 (一)5G 网络的特点 高速率:5G 依托良好技术架构,提供更高的网络速度,峰值要求不低于 20Gb/s,下载速度最高达 10Gbps。相比 4G 网络,5G 的基站速度…

LDR6500U PD取电协议芯片:高效充电与智能管理的典范

在当今快速发展的电子设备市场中,高效、安全、稳定的充电技术已成为衡量设备性能的重要指标之一。而LDR6500U,作为乐得瑞科技有限公司针对USB PD(Power Delivery)协议及Quick Charge(QC)协议开发的一款高性…

Plugin - 插件开发05_Solon中的插件实现机制

文章目录 Pre概述插件插件扩展机制(Spi)插件扩展机制概述插件扩展机制的优势 插件扩展机制实现步骤第一步:定制插件实现类示例代码:插件实现类 第二步:通过插件配置文件声明插件示例插件配置文件:META-INF/…

JAVA-二叉树的概念和性质

目录 一.树形结构 1.1 概念 1.2 树的概念(重要)​编辑 补充:高度和深度的区别 1.3 树的应用 二. 二叉树(重点) 2.1 概念 2.2 两种特殊的二叉树 2.3 二叉树的性质 2.4 选择题 一.树形结构 1.1 概念 树是一种 非线性 的数据结构&…

SVM的基本思想

一、SVM的基本思想 SVM的基本思想是在样本的向量空间中寻找一个超平面,使得两类样本被分割在平面的两端。这样的平面理论上有无穷多个,但SVM的目标是找到一个最优的超平面,即两侧距离超平面最近的样本点到超平面的距离被最大化的超平面。这个…

【TCP 网络通信(发送端 + 接收端)实例 —— Python】

TCP 网络通信(发送端 接收端)实例 —— Python 1. 引言2. 创建 TCP 服务器(接收端)2.1 代码示例:TCP 服务器2.2 代码解释: 3. 创建 TCP 客户端(发送端)3.1 代码示例:TCP…

day08 接口测试(3)——postman工具使用

下载 postman 的历史版本:Postman 历史版本下载 - 简书 今天开始学习 postman 这个测试工具啦。 【没有所谓的运气🍬,只有绝对的努力✊】 目录 1、postman简介 2、postman的安装 3、给postman安装插件——newman 3.1 环境安装 3.1.1 安…

README写作技巧

做一个项目,首先第一眼看上去要美观,这样才有看下去的动力。做项目亦是如此,如果每一步应付做的话,我想动力也不会太大,最终很大概率会放弃或者进度缓慢。 1.README组成 README是对项目的一个说明,它对观看…

渗透测试---burpsuite(5)web网页端抓包与APP渗透测试

声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人与泷羽sec团队一律不承担一切后果 视频地址:泷羽---bp&…

【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之前端环境搭建

【Springboot3vue3】从零到一搭建Springboot3vue3前后端分离项目之前端环境搭建 2 前端环境搭建2.1 环境准备2.2 创建Vue3项目2.3 项目搭建准备2.4 安装Element Plus2.5 安装axios2.5.1 配置(创建实例,配置请求,响应拦截器)2.5.2 …

11.27-12.5谷粒商城

目录 新增商品 1.上线会员服务 2. 获取分类关联的品牌 3.获取选定分类下的属性分组和属性 4.新增商品vo 5.保存商品信息 6.Spu检索 7.Sku商品检索 新增商品 1.上线会员服务 将会员服务注册到nacos注册中心,启用服务注册发现EnableDiscoveryClient。 同时新增…

深入解析非桥PCI设备的访问和配置方法

往期内容 本文章相关专栏往期内容,PCI/PCIe子系统专栏: 嵌入式系统的内存访问和总线通信机制解析、PCI/PCIe引入 Uart子系统专栏: 专栏地址:Uart子系统 Linux内核早期打印机制与RS485通信技术 – 末片,有专栏内容观看…