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

事件循环机制

eventLoop

事件循环(Event Loop)是用于管理和调度异步任务执行的一种机制,通常在浏览器中,也在其他 JavaScript 运行环境中存在。事件循环确保 JavaScript 单线程的执行模型下能够处理非阻塞的异步任务,以避免程序阻塞和提高性能。

js引擎遇到一个异步事件后并不会一直等待其返回结果,而是会将这个事件挂起(交给webapi处理),继续执行执行栈中的其他任务。当一个异步事件返回结果后(例如延时时间到了、ajax得到结果了等),js会将这个事件加入与当前执行栈不同的另一个队列,我们称之为任务(事件)队列。被放入任务队列不会立刻执行其回调,而是等待当前执行栈中的所有任务都执行完毕, 主线程处于闲置状态时,主线程会去查找事件队列是否有任务。如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中,然后执行其中的同步代码…,如此反复,这样就形成了一个无限的循环。这就是这个过程被称为“事件循环(Event Loop)”的原因。

事件循环的基本概念如下:

  1. 调用栈(Call Stack):JavaScript 中的代码执行是通过调用栈来管理的,它用于追踪函数调用的层次关系。当函数被调用时,它会被推入调用栈,当函数执行完毕后,将被从调用栈中弹出。

  2. 消息队列(Message Queue):消息队列用于存储异步任务的回调函数。当异步任务完成后,它们的回调函数会被推入消息队列。

  3. 事件循环(Event Loop):事件循环是一个循环,它不断地检查调用栈和消息队列。如果调用栈为空,事件循环会查看消息队列是否有待处理的任务。如果有,它会将任务的回调函数推入调用栈,然后执行该函数。

事件循环的流程可以简化为以下步骤:

  • 检查调用栈是否为空。
  • 如果调用栈为空,检查消息队列是否有待处理的任务。
  • 如果有,将下一个任务的回调函数推入调用栈,并执行。
  • 重复上述步骤。

这个机制确保了 JavaScript 在执行异步任务时不会阻塞主线程,从而保持了页面的响应性。常见的异步任务包括定时器回调、事件处理函数、网络请求等。

在浏览器中,事件循环也与 Web API(如DOM操作、Ajax请求)以及宿主环境(浏览器)紧密相关。当异步任务完成后,它们的回调函数会被添加到消息队列,然后由事件循环执行。

调用栈是什么?

调用栈(Call Stack)是 JavaScript 引擎用来追踪函数调用的一种数据结构。它以栈(Stack)的形式组织,遵循后进先出(Last-In-First-Out,LIFO)的原则。调用栈用于跟踪当前执行上下文(函数调用)的堆栈帧(Stack Frame)。

具体来说,调用栈有以下重要特性和作用:

  1. 函数调用的追踪:每当函数被调用时,一个新的堆栈帧被推入调用栈的顶部。这个堆栈帧包含了函数的参数、局部变量以及函数内部的代码等信息。

  2. 后进先出原则:调用栈遵循后进先出的原则,也就是最后进入的函数最先执行完毕并从栈顶弹出。这意味着函数调用的顺序是依次进栈和出栈的。

  3. 递归调用:递归函数调用时,每个递归调用都会创建一个新的堆栈帧,并推入栈顶。这些堆栈帧会一直保留,直到递归结束,然后按照 LIFO 原则一个个出栈。

  4. 错误追踪:当发生错误时,调用栈会提供有关错误发生位置的信息,这对于调试非常有帮助。错误消息通常包括堆栈跟踪,显示了错误发生的函数调用链。

以下是一个示例,展示了如何在 JavaScript 中使用调用栈:

function greet(name) {console.log(`Hello, ${name}!`);
}function sayHello() {greet("Alice");greet("Bob");
}sayHello();

在这个示例中,当 sayHello 被调用时,它会依次调用 greet("Alice")greet("Bob")。这两个函数的堆栈帧将被依次推入调用栈,然后依照 LIFO 原则执行完毕并出栈。

相关文章:

事件循环机制

eventLoop 事件循环(Event Loop)是用于管理和调度异步任务执行的一种机制,通常在浏览器中,也在其他 JavaScript 运行环境中存在。事件循环确保 JavaScript 单线程的执行模型下能够处理非阻塞的异步任务,以避免程序阻塞…...

苹果曾考虑基于定位控制AirPods Pro自适应音频

在一次最近的采访中,苹果公司的高管Ron Huang和Eric Treski透露,他们在开发AirPods Pro自适应音频功能时,曾考虑使用GPS信号来控制音频级别。这个有趣的细节打破了我们对AirPods Pro的固有认知,让我们对苹果的创新思维有了更深的…...

【代码阅读笔记】yolov5 rknn模型部署

一、main函数思路 二、值得学习的地方 1、关注yolov5检测流程 2、其中几个重要的结构体 typedef struct {int left;int right;int top;int bottom; } YOLOV5_BOX_RECT; // box坐标信息typedef struct {char name[YOLOV5_NAME_MAX_SIZE];int class_index;YOLOV5_BOX_RECT box…...

【多线程】进程与线程 并发编程 面试题总结

进程和线程 进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基…...

C++算法 —— 动态规划(10)二维费用背包

文章目录 1、动规思路简介2、一和零3、盈利计划 背包问题需要读者先明白动态规划是什么,理解动规的思路,并不能给刚接触动规的人学习。所以最好是看了之前的动规博客,以及两个背包博客,或者你本人就已经懂得动规了。 1、动规思路简…...

MySQL数据库正在耗用大量CPU的问题排查

这是一篇实战性的文章,如何处理正在发生的MYSQL服务器CPU飙升的问题,一般情况下,MySQL是不会耗用这么高的CPU的,要么是不走索引的查询,要么是同一时间出现了大量比较耗用资源的查询,不管出现的是哪一种情况…...

php替换字符串里的a变为b

$tempstrstr_replace("\\","/",$tempstr); //把$tempstr中的a替换成b $tempstrstr_replace("a","b",$tempstr);...

黑豹程序员-架构师学习路线图-百科:CSS-网页三剑客

文章目录 1、为什么需要CSS2、发展历史3、什么是CSS4、什么是SASS、SCSS 1、为什么需要CSS 作为网页三剑客的第二,CSS为何需要它,非常简单HTML只能完成页面的展现,但其做出来的页面奇丑无比。 随着网络的普及,人们的要求更高&…...

NUWA论文阅读

论文链接:NUWA: Visual Synthesis Pre-training for Neural visUal World creAtion 文章目录 摘要引言相关工作视觉自回归模型视觉稀疏自注意 方法3D数据表征3D Nearby Self-Attention3D编码器-解码器训练目标 实验实现细节与SOTA比较T2I微调T2V微调V2V微调Sketch-t…...

4.Tensors For Beginners-Vector Definition

在上一节,已经了解了前向和后向转换。 什么是向量? 定义1:向量是一个数字列表 这很简洁,也通俗易懂。 现有两个向量: 如果要把这两个向量给加起来,只需把对应位置的元素(组件)给加起来。 而要缩放向量&…...

vertx学习总结5

这章我们讲回调,英文名:Beyond callbacks 一、章节覆盖: 回调函数及其限制,如网关/边缘服务示例所示 未来和承诺——链接异步操作的简单模型 响应式扩展——一个更强大的模型,特别适合组合异步事件流 Kotlin协程——…...

Go,从命名开始!Go的关键字和标识符全列表手册和代码示例!

目录 一、Go的关键字列表和分类介绍关键字在Go中的定位语言的基石简洁与高效可扩展性和灵活性 关键字分类声明各种代码元素组合类型的字面表示基本流程控制语法协程和延迟函数调用 二、Go的关键字全代码示例关键字全代码示例 三、Go的标识符定义基础定义特殊规定关键字与标识符…...

【网络】网络扫盲篇 ——用简单语言和图解带你入门网络

网络的一些名词和基础知识讲解 前言正式开始一些基础知识发展背景运营商和生产商 协议协议的分层TCP/IP五层(或四层)模型(可以不看,对新手来说太痛苦了,我这里只是为了让屏幕前的你过一遍就好,里面很多概念新手是不太懂的&#xf…...

【项目开发 | C语言项目 | C语言薪资管理系统】

本项目是一个简单的薪资管理系统,旨在为用户提供方便的员工薪资管理功能,如添加、查询、修改、删除员工薪资信息等。系统通过命令行交互界面与用户进行交互,并使用 txt 文件存储员工数据。 一,开发环境需求 操作系统:w…...

Android---GC回收机制与分代回收策略

目录 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾回收算法 JVM 分代回收策略 1. 新生代 2. 老年代 GC Log 分析 引用 GC 回收机制 垃圾回收(Garbage Collection, GC) 垃圾就是内存中已经没有用的对象,JVM 中的垃圾回收器(Garbage Collector)会自…...

前缀、中缀、后缀表达式相互转换工具

目录 1. 界面一览 2. 使用说明 3. 实例演示 3.1 输入中缀 3.2 输入前缀 3.3 输入后缀 3.4 选择错误的类型 4. 代码 5. 资源地址 关于什么是前缀、中缀、后缀表达式,相信你不知道这个东西,那你也不会点进来这篇博客,当然,…...

Vue之ElementUI之动态树+数据表格+分页(项目功能)

目录 前言 一、实现动态树形菜单 1. 配置相应路径 2. 创建组件 3. 配置组件与路由的关系 index.js 4. 编写动态树形菜单 5. 页面效果演示 二、实现数据表格绑定及分页功能 1. 配置相应路径 2. 编写数据表格显示及分页功能代码 BookList.vue 3. 演示效果 总结 前言…...

【CAD二次开发】给CAD添加TRUSTEDPATHS避免dll插件信任弹窗

找到配置文件目录,遍历下面的每个配置文件; 找到 Variables 下的TRUSTEDPATHS项目;在后面添加新的目录即可,多个目录使用分号分隔; public static void AddPath(string trusedPath){// 指定注册表键的路径...

编译和链接

编译和链接 一:???二:翻译环境1:编译1:预处理2:编译 2:链接 三:运行环境: 本文章所使用的图片均来在yyds鹏哥一:?&#xf…...

常识判断 --- 科技常识

目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型...

3步解决Windows驱动臃肿难题:DriverStore Explorer让系统空间释放效率提升80%

3步解决Windows驱动臃肿难题:DriverStore Explorer让系统空间释放效率提升80% 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 诊断系统存储异常 "为什么我的C盘…...

160+实用功能:OneMore插件如何让OneNote笔记管理效率翻倍?[特殊字符]

160实用功能:OneMore插件如何让OneNote笔记管理效率翻倍?🚀 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 还在为OneNote单调的功…...

服务器风扇静音改造:揭秘线序定义的通用破解技巧——以IBM SystemX 3630 M4为案例

1. 为什么服务器风扇这么吵? 服务器风扇的噪音问题困扰着很多运维人员和家庭实验室用户。我拆解过几十台不同品牌的服务器,发现这个问题的根源在于服务器的散热设计理念与家用电脑完全不同。 服务器在设计时优先考虑的是稳定性和散热效率,而不…...

OpenClaw成本优化方案:ollama GLM-4.7-Flash自建模型接口实践

OpenClaw成本优化方案:ollama GLM-4.7-Flash自建模型接口实践 1. 为什么需要关注OpenClaw的token消耗问题 第一次用OpenClaw完成自动化周报任务时,我盯着账单倒吸一口凉气——生成三份周报竟然消耗了接近15万token。这让我意识到,如果不解决…...

42-西门子1200伺服控制5轴程序 程序采用1200系列PLC,项目实现以下功能: (1)

42-西门子1200伺服控制5轴程序 程序采用1200系列PLC,项目实现以下功能: (1).三轴机械手联动取放料PTO脉冲定位控制台达B2伺服 (2).台达伺服速度模式应用扭矩模式应用实现收放卷 (3).…...

Gemini提示词反推教程!“图生图”来了

看到一张心仪的室内设计图,却不知道如何描述它的高级美? 其实,每一张令人惊艳的图片背后,都有一套隐藏的代码。今天,我们要分享一套“保姆级”教程:利用 MetaChat 平台上的 Gemini 3.1 Pro 充当你的私人审美…...

别再滥用Tick了!UE5里Cast To的正确打开方式与性能实测

UE5性能优化实战:Tick事件中Cast To的高效替代方案 在虚幻引擎5的项目开发中,性能优化往往隐藏在那些看似无害的日常操作里。Tick事件中的Cast To操作就像房间里的大象——人人都知道它存在,却常常低估它的影响。当项目规模扩大、逻辑复杂度提…...

A-59F 多功能语音处理模组:覆盖全场景人群,让每一次语音都清晰无噪

在门禁对讲、会议扩音、车载通话、导游喊话、监护设备、智能工牌等各类语音设备中,啸叫刺耳、环境嘈杂、回音不断、拾音模糊、通话断续是所有人共同的痛点。一款真正解决问题的核心硬件 ——A-59F 多功能语音处理模组,它集成扩音防啸叫、AI ENC 降噪、AE…...

节能模式:OpenClaw+nanobot的间歇性任务调度技巧

节能模式:OpenClawnanobot的间歇性任务调度技巧 1. 为什么需要节能模式 去年夏天,我的电费账单突然飙升。排查后发现,那台24小时运行OpenClaw的工作站竟然是耗电大户——它持续调用着本地部署的Qwen大模型,GPU风扇昼夜不停地呼啸…...

深入FFmpeg解码器:从avcodec_send_packet看硬解与软解的实现差异

深入FFmpeg解码器:从avcodec_send_packet看硬解与软解的实现差异 在多媒体处理领域,FFmpeg无疑是开发者最常接触的开源框架之一。其强大的编解码能力支撑着从视频播放器到直播系统的各类应用,而解码器作为其中的核心组件,其性能直…...