JavaScript之事件队列(event loop)

AMBA-CHI协议详解(一) CHI体系结构是一种可扩展、一致性的集线器接口和片上互联,可由多个组件使用。CHI体系结构允许根据性能、功耗和面积系统要求灵活地进行组件连接拓扑。硬件一致性使系统组件能够共享内存,而无需维护软件缓存以保持一致性。如果两个组件对同一存储器位置的写入可被所有组件以相同的顺序观察到,则存储器区域是一致的。 阅读详情

一、前言

我们都知道,javaScript是一门单线程、非阻塞的脚本语言。

单线程意味着,在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。

为什么要单线程呢?

因为作为浏览器脚本语言JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程。

非阻塞是当代码需要进行一项异步任务(无法立刻返回结果,需要花一定时间才能返回的任务,如I/O事件)的时候,主线程会挂起(pending)这个任务,然后在异步任务返回结果的时候再根据一定规则去执行相应的回调。

那么是怎么实现“非阻塞”的呢?

接下来我们就探讨一下~~~~

二、事件队列(Task Queue)

首先我们来看一个简单的例子:

console.log(1);

setTimeout(function(){
    console.log(2);
},1000)

console.log(3)

//1
//3
//2

以上代码中:

console.log(1)和console.log(3)是同步代码,放在执行栈中按照顺序执行;

setTimeout是异步事件,js引擎会将它挂起,继续执行下面的同步代码,等到一秒钟之后,js会将这个事件加入与当前执行栈不同的另一个队列,我们称之为事件队列(Task Queue)。被放入事件队列不会立刻执行其回调,而是等待当前执行栈中的所有任务都执行完毕, 主线程处于闲置状态时,主线程会去查找事件队列是否有任务。如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中,然后执行其中的同步代码...,如此反复,这样就形成了一个无限的循环。

三、宏任务(macro task)和微任务(micro task)

因为异步任务之间并不相同,因此他们的执行优先级也有区别。不同的异步任务被分为两类:微任务(micro task)和宏任务(macro task)。

宏任务(macro task),浏览器为了能够使得JS内部task与DOM任务能够有序的执行,会在一个task执行结束后,在下一个 task 执行开始前,对页面进行重新渲染 (task->渲染->task->...)
鼠标点击会触发一个事件回调,需要执行一个宏任务,然后解析HTMl。

微任务(micro task ),微任务通常来说就是需要在当前 task 执行结束后立即执行的任务,比如对一系列动作做出反馈,或或者是需要异步的执行任务而又不需要分配一个新的 task,这样便可以减小一点性能的开销。所有微任务总会在下一个宏任务之前全部执行完毕。

以下事件属于宏任务:

  • setInterval()
  • setTimeout()

以下事件属于微任务

  • new Promise()
  • new MutaionObserver()
  • process.nextTick
【OpenClaw企业级智能体实战】第10篇:医疗行业OpenClaw实战:病历自动书写、医保智能审核与患者随访管理(附HIPAA合规配置+完整代码) 医疗行业正面临“效率提升需求”与“合规监管红线”的双重矛盾:病历书写占据医生30%-50%工作时间,医保审核效率低下,患者随访工作量巨大,但医疗数据“不出域”“责任不转移”的要求又限制了AI落地。本文基于华为云、腾讯云安全规范及中关村科金、复旦大学附属中山医院等真实实践,拆解OpenClaw在医疗场景的五大核心应用(病历自动书写、医保智能审核、患者随访管理、科研文献综述、医学影像预处理),提供私有化部署架构、HIPAA合规配置模板、完整实操流程及可直接运行的代码。 阅读详情

相关推荐

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4945

js事件队列(event-loop)宏任务、微任务

#为什么要有事件循环呢? eventloop顾名思义就是事件循环,为什么要有事件循环呢?因为V8是单线程的,即同一时间只能干一件事情,但是呢文件的读取,网络的IO处理是很缓慢的,并且是不确定的,如果同步等待它们响应,那么用户就起飞了。于是我们就把这个事件加入到一个事件队列里(task),等到事件完成时,eventloop再执行一个事件队列。 所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务...

hbjiankely的博客 2360

抖音小游戏(IAA)巨量引擎投放指南

摘要:本文详细介绍了在巨量引擎平台投放小游戏广告的完整流程,包括五个关键步骤:1)添加小游戏资产,填写ID等信息并等待审核;2)添加事件管理,配置激活和关键行为事件;3)通过橙子建站创建落地页,设置跳转链接;4)新建广告项目,选择小程序推广目标;5)完成广告创建。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 4508

事件队列、事件循环机制简述

当我们调用一个方法的时候,js会生成一个与这个方法对应的执行环境,而当一系列方法被依次调用的时候,因为js是单线程的,同一时间只能执行一个方法,于是这些方法被排队在一个单独的地方,这个地方被称为。如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中,然后执行其中的同步代码,如此反复,这样就形成了一个无限的循环。异步任务指的是: 不进入主线程,而是进入一个"任务队列"的任务,当主线程中的任务执行完,才会从任务队列中取出异步任务放入主线程执行。异步任务分为:异步宏任务、异步微任务。

weixin_49734970的博客 614

星网宇达Newton-M2设备安装及配置

主要介绍了星网宇达Newton-M2设备的配置过程

weixin_49353445的博客 2679

46、聚类算法在智能交通数据分析中的应用

本文探讨了聚类算法在智能交通数据分析中的应用,介绍了K-均值算法、K-中心点算法和基于模型的聚类算法的基本原理及特点,并结合实际交通数据讨论了其应用场景与挑战。通过聚类分析,能够从海量交通数据中发现隐藏模式,为交通管理和规划提供科学依据。文章还展示了具体的案例分析和实现流程,为未来智能交通系统的发展提供了参考。

zz67890的博客 134

JavaScript 事件队列

JavaScript 事件队列 JavaScript 是单线程执行代码片段的。 早期历史 早期(ES6 之前)的 JavaScript 引擎只负责子啊合适的时候执行某一个 JavaScript 代码段,此时的代码主要是被分为很多的事件,然后按照一定的顺序(事件循环队列)进行执行。此时的事件队列主要是靠宿主环境(此时一般都为浏览器)来维护的,存在很多的不可靠性。 ES6 的事件队列 ES6 之后,由于 Promise 的出现,JavaScript 引擎开始对事件循环队列进行直接控制,从而出现了事件队列(宏任务

愿得一人心&&的博客 1195

《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)

《C++面向对象程序设计》✍千处细节、万字总结 文章目录《C++面向对象程序设计》✍千处细节、万字总结一、面向对象程序设计二、C++基础2.1 C++的产生和特点2.2 一个简单的C++示例程序2.3 C++在非面向对象方面对C语言的扩充输入和输出cinconst修饰符void型指针内联函数带有默认参数值的函数函数重载作用域标识符"::"强制类型转换new和delete运算符引用三、类和对象(一)3.1 类的构成3.2 成员函数的定义3.3 对象的定义和使用3.4 构造函数与析构函数构造函数成员初始化列表

像写诗一样优雅地写代码~ 78万+

JS事件循环机制,从浏览器进程模型、主线程工作模式、各种队列执行顺序等全面讲解

事件循环又叫做消息循环,是浏览器渲染主线程的工作方式。在 Chrome 的源码中,它开启一个不会结束的 for 循环,每次循环从消息队列中取出第一个任务执行,而其他线程只需要在合适的时候将任务加入到队列末尾即可。过去把消息队列简单分为宏队列和微队列,这种说法目前已无法满足复杂的浏览器环境,取而代之的是一种更加灵活多变的处理方式。根据 W3C 官方的解释,每个任务有不同的类型,同类型的任务必须在同一个队列,不同的任务可以属于不同的队列。

求上得中,求中得下 1442

嵌入式开发之瑞芯微RK356x--基本环境搭建

嵌入式环境搭建

NexyHO的博客 618

告警不是闹钟:AI 如何把告警过滤成真正的“求救信号”?

告警不是闹钟:AI 如何把告警过滤成真正的“求救信号”?

Echo_Wish 242

什么是事件循环

基本概念与作用事件循环的概念事件循环的作用执行流程示例一:简单的宏任务和微任务示例二:嵌套的宏任务和微任务示例三:事件循环中的异步API示例四:微任务的优先级示例五:事件循环中的错误处理实际工作中的使用技巧优化UI渲染控制任务优先级异步错误处理避免长时间运行的同步代码利用最新的异步API在Web前端开发中,理解JavaScript的执行机制对于编写高效、响应迅速的应用程序至关重要。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 901

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Event Loop 这个循环你晓得么?(附GIF详解)

Event Loop 这个循环你晓得么?(附GIF详解) 前言 我们都知道JavaScript是一门单线程、非阻塞的脚本语言,目的是为了实现与浏览器交互。 这里我们提到了两点:一是单线程,二是非阻塞。 单线程是指JavaScript在执行的时候,有且只有一个主线程来处理所有的任务。 但是他为什么一定是单线程,而不是多线程的呢? 我们设想一下,如果JavaScript是多线程的,现...

tzllxya的博客 505

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JAVASCRIPT之事件队列(Event Queue)和事件循环(Event Loop)

文章目录前言一、同步任务和异步任务二、事件队列和事件循环三、宏任务和微任务四、总结参考连接 前言 之前学习的时候对js中事件队列不是很了解,参考了很多资料,小小总结一下。 (本文只用于自身学习,作为资料保存) 一、同步任务和异步任务 JavaScript是一门单线程语言,所谓单线程,就是指一次只能完成一件任务,如果在同个时间有多个任务的话,这些任务就需要进行排队,前一个任务执行完,才会执行下一个任务。但如果有一个任务的执行时间很长,比如文件的读取或者数据的请求等等,那么后面的任务就要一直等待,这就会影响用

weixin_42291355的博客 2531

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【朴灵评注】JavaScript 运行机制详解:再谈Event Loop

转自:https://blog.youkuaiyun.com/lin_credible/article/details/40143961 PS: 我先旁观下大师们的讨论,得多看书了~ 别人说的:“看了一下不觉得评注对到哪里去,只有吹毛求疵之感。 比如同步异步介绍,本来就无大错;比如node图里面的OS operation,推敲一下就可以猜到那是指同步操作(自然不走event loop了)...

嘿嘿 132

形象化解读js事件循环以及node事件循环和浏览器事件循环的区别

node和浏览器都是js运行的环境,二者都给js提供了一个很强大的功能,事件循环。那么什么是事件循环呢,简单讲就是在单线程中为了实现程序的高效运行而设定的事件执行机制 ...

前端361 2610

JavaScript——Event Loop事件队列,同步异步操作

目录理解Event Loop规则例题例题1 顺丰面试题例题2 比较全面的检测例题3 来自《深入浅出Node.js》例题4 Promise的异步例题4 setTimeout的时间变化例题5 宏任务和微任务互相穿插 理解Event Loop Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。 JavaScr...

goldgirly的博客 278

js event loop事件队列详解(浏览器中)

目录首先认识一个栈两个队列执行过程异步任务怎么分配简单例子难一点的例子 首先 要知道js是单线程的,就是一件一件做,做完一件做下一件。 认识一个栈两个队列 一个调用栈Stack。 一个宏队列,macrotask,也叫tasks。 一个微队列,microtask,也叫jobs。 执行过程 js就是执行全局Script同步代码,这中间碰到一些异步任务先加进对应的队列。 做完之后,调用栈就为空了。 然后将队列(先微队列后宏队列)里面的首个任务提到调用栈来做,一件一件做完直到队列中的任务都做完。 总结就是,先做同步

在下月亮有何贵干 616

唠唠js中事件循环Event Loop,事件队列Event Queue

在代码执行中 首先我们在执行栈里面执行代码,自上而下执行(先变量提升).当遇见异步代码时候,把异步代码放进事件队列中. 事件队列如下图,分成微任务与宏任务.当我们代码执行过程中,遇见异步代码,是宏任务的就放进事件队列的宏任务里,以此类推. 当代码中同步代码执行完成,这时,我们去事件队列中寻找有没有微任务,如果有微任务,我们按照顺序把微任务依次拿到执行栈内执行(一次只能拿一个任务去执行栈执行),当事件队列中没有微任务了.我们在去找宏任务. 这个寻找的过程叫事件循环. ...

tt010175的博客 214

多线程启动定时器 会等待上一次执行完成?_前端进阶从多线程角度来看 Event Loop...

引子几乎在每一本JS相关的书籍中,都会说JS是 单线程的,JS是通过事件队列 (EventLoop)的方式来实现异步回调的。对很多初学JS的人来说,根本搞不清楚单线程的JS为什么拥有 异步的能力,所以,我试图从 进程、 线程的角度来解释这个问题。CPU算机的核心是 CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。进程定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车...

weixin_39523835的博客 344

一图彻底搞懂事件队列 js中的Event Loop

主线程从"任务队列"中读取执行事件,这个过程是循环不断的,这个机制被称为事件循环。此机制具体如下:主线程会不断从任务队列中按顺序取任务执行,每执行完一个任务都会检查microtask队列是否为空(执行完一个任务的具体标志是函数执行栈为空),如果不为空则会一次性执行完所有microtask。然后再进入下一个循环去任务队列中取下一个任务执行。

Big_YiFeng的博客 419

js的事件循环(Event loop)、执行上下文、执行栈和事件队列的手记

js是一个单线程非阻塞的脚本语言。 单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务。 非阻塞则是当代码需要进行一项异步任务(无法立刻返回结果,需要花一定时间才能返回的任务,如I/O事件)的时候,主线程会挂起(pending)这个任务,然后在异步任务返回结果的时候再根据一定规则去执行相应的回调。 为什么要单线程?因为js是和浏览器交互的,需要操作各种dom, 如果javascript是多线程的,那么当两个线程同时对dom进行一项操作,例如一个向其添加事件,而另一个删除

weixin_46554760的博客 400

JS事件循环Event Loop(事件队列)

优先执行同步任务,遇到异步任务推入任务队列中,等同步任务执行完再执行任务队列中的异步任务,异步任务中又分安任务和微任务,先执行微任务,再执行宏任务。宏任务: setTimeout,setlnterval,ajax,dom事件监听..微任务: Promise.then().catch(),async/await...1.同步任务:在主线程上执行的,形成一个执行栈,前一个任务执行完后执行后一个任务。2.异步任务: 通过回调函数实现在做任务的同时还能做其他任务。比如定时器的回调,ajax的回调,事件函数。

ap_25的博客 69

浅谈 JS 事件循环 (Event Loop)

注: 文章参考自浅析 JS 中的 EventLoop 事件循环(新手向) 概念 JavaScript 是一门单线程语言, 即同一时间只能执行一个任务, 也就是说代码执行是同步并且阻塞的 只能同步执行肯定是有问题的, 所以 JS 有了一个用来实现异步的函数:setTimeout 队列 (Queue) 队列是一种 FIFO(First In, First Out) 的数据结构,它的特点就是先进先出...

小贤笔记 292

浏览器中的Eventloop

事件循环

weixin_42447364的博客 483

js的event loop

js的宏任务分为同步任务和异步任务,同步任务都在JS引擎线程上执行,形成一个执行栈,事件触发线程管理一个事件队列,异步任务触发条件达成,将回调事件放到事件队列中,执行栈中所有同步任务执行完毕,此时JS引擎线程空闲,系统会读取事件队列,将可运行的异步任务回调事件添加到执行栈中,开始执行。注微任务的优先级是高于渲染的,promise的then是微任务,但是微任务是有任务队列的,异步执行完promise的then才会添加到微任务队列,所以如果异步没有执行完会直接执行下一个宏任务。即先执行的函数后销毁,如图。...

大象的博客 320
上一篇: JavaScript之执行栈和堆
下一篇: javaScript之变量提升
github_turboemily
博客等级 码龄10年 16粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值