首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JS事件循环机制(Event Loops)

其实,在 JavaScript 中,代码的执行顺序并不是完全按照它们的书写顺序,而是取决于它们在 **事件循环** 中的顺序。 2. **什么是事件循环?...一个遵循 ECMAScript 标准的代理(浏览器或 JS 引擎)也必须遵循事件循环机制事件循环是由一个或以上的 **任务队列** 组成的。 3. **什么是任务队列?...) * `` 由于当前任务队列已经处于执行状态,所以任务队列中遇到的宏任务将进入到下一次事件循环的任务队列,而微任务则会被放入到本次事件循环的微任务队列中。...每次事件循环都会有一个初始为空的微任务队列。...测试题 看到这里,JavaScript 的事件循环机制差不多就解释完了,涉及到了同步任务、异步任务、宏任务和微任务以及它们之间的关系。

1.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

js事件循环机制和优先级

浏览器的渲染进程是多线程,包括 GUI渲染线程 js引擎线程 事件触发线程 定时器触发线程 异步http请求线程 主执行栈和任务队列 所有的任务可以分为同步任务和异步任务,同步任务,顾名思义,就是立即执行的任务...,同步任务一般会直接进入到主线程中执行;而异步任务,就是异步执行的任务,比如ajax网络请求,setTimeout 定时函数等都属于异步任务,异步任务会通过任务队列( Event Queue )的机制来进行协调...上述过程的不断重复就是我们说的 Event Loop (事件循环)。...microtask主要包含:Promise.then、MutaionObserver、process.nextTick(Node.js 环境) 它们的执行顺序如下: 在事件循环中,每进行一次循环操作称为...,立即执行当前微任务队列中的所有微任务(依次执行) 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取) 宏任务与微任务的优先级(

1.3K20

js事件循环

之前有看过一些事件循环的博客,不过一阵子没看就发现自己忘光了,所以决定来自己写一个博客总结下!...首先,我们来解释下事件循环是个什么东西: 就我们所知,浏览器的js是单线程的,也就是说,在同一时刻,最多也只有一个代码段在执行,可是浏览器又能很好的处理异步请求,那么到底是为什么呢?...从上图我们可以看出,js主线程它是有一个执行栈的,所有的js代码都会在执行栈里运行。...microtask任务会在当前事件循环周期内执行,而新增的macrotask任务只能等到下一个事件循环才能执行了(一个事件循环只执行一个macrotask) 首先,我们先来看一段代码 console.log...原因:因为一开始js主线程中跑的任务就是macrotask任务,而根据事件循环的流程,一次事件循环只会执行一个macrotask任务,因此,执行完主线程的代码后,它就去从microtask队列里取队首任务来执行

18.7K41

JS 事件循环

,脚本执行,事件处理等 其包含的线程有:GUI 渲染线程(负责渲染页面,解析 HTML,CSS 构成 DOM 树)、JS 引擎线程、事件触发线程、定时器触发线程、http 请求线程等主要线程 关于执行中的线程...工作线程:也称幕后线程,这个线程可能存在于浏览器或js引擎内,与主线程是分开的,处理文件读取、网络请求等异步事件。...(先进先出的机制)来进行协调。...上述过程的不断重复就是我们说的 Event Loop (事件循环)。...在事件循环中,每进行一次循环操作称为tick,通过阅读规范可知,每一次 tick 的任务处理模型是比较复杂的,其关键的步骤可以总结如下: 在此次 tick 中选择最先进入队列的任务( oldest task

15.4K10

eventLoop事件循环机制

所以一次鼠标点击,或是计时器到达时间点,或是 Ajax 请求完成触发了回调函数,这些事件处理程序或回调函数都不会立即运行,而是立即排队,一旦线程有空闲就执行。...假如当前 JavaScript 进程正在执行一段很耗时的代码,此时发生了一次鼠标点击,那么事件处理程序就被阻塞,用户也无法立即看到反馈,事件处理程序会被放入任务队列,直到前面的代码结束以后才会开始执行。...理解eventloop 因为js是单线程,所以有一套固定的执行顺序,也就是eventloop。 eventloop分为同步任务和异步任务。同步任务执行完才会执行异步任务。...eventloop过程简述:js从第一个宏任务(script标签)开始执行,会先把同步代码都执行完,中途遇到微任务先加入微队列,宏任务加入宏队列。等同步代码清完,先清空微队列。...循环往复 (宏1 → 宏1同步 → 所有微 → 宏2 → 宏2同步 → 所有微 → 宏3同步···) 举个栗子 1 2 //script标签属于宏任务,会开启第一个宏任务 3 4console.log

48920

Js事件循环(Event Loop)机制以及实例讲解

主线程 要明确的一点是,主线程跟执行栈是不同概念,主线程规定现在执行执行栈中的哪个事件。 主线程循环:即主线程会不停的从执行栈中读取事件,会执行完所有栈中的同步代码。...') } console.log('c事件执行完') } a(); b(); c(); // 当a、b、c函数都执行完成之后,三个setTimeout才会依次执行 ---- js 异步执行的运行机制...环境) 微任务(microtask): Promise、 MutaionObserver、process.nextTick(Node.js环境) Event Loop(事件循环): Event Loop...忍者秘籍 ---- 结语 类似上文的面试题还有很多,实则都大同小异,只要掌握了事件循环机制,这些问题都会变得很简单。 文章如有不正确的地方欢迎各位路过的大佬鞭策!...以上2018.6.16 参考资料: 详解JavaScript中的Event Loop(事件循环机制 JavaScript中的事件循环 Event Loop JavaScript 运行机制详解:再谈Event

1.6K10

JavaScript事件循环机制解析

并不仅仅是因为面试遇到了,而是理解JavaScript事件循环机制会让我们平常遇到的疑惑也得到解答。...事件循环 JavaScript是单线程,非阻塞的 浏览器的事件循环 执行栈和事件队列 宏任务和微任务 node环境下的事件循环 和浏览器环境有何不同 事件循环模型 宏任务和微任务 经典题目分析 1....().then(回调) MutationObserver(html5 新特性) 运行机制 异步任务的返回结果会被放到一个任务队列中,根据异步事件的类型,这个事件实际上会被放到对应的宏任务和微任务队列中去...)机制 JavaScript 运行机制详解:再谈Event Loop Node 定时器详解 面试题:说说事件循环机制(满分答案来了) 极客浏览器工作原理与实践 微任务、宏任务与Event-Loop JavaScript...:彻底理解同步、异步和事件循环(Event Loop) Node.js event loop 和 JS 浏览器环境下的事件循环的区别

55430

js事件机制

什么是事件流 在JavaScript中事件流是指一个事件沿特定数据结构传播的一个过程。整个事件流总共包含三个阶段(从dome2来说):1.事件捕获阶段、2.处于事件目标阶段、3.事件冒泡阶段。...从这个图里面我们可以清晰的看到整个事件流的执行过程,首先是从window开始,一步步的从上向下执行,此过程就是事件捕获阶段,当到达了事件的位置以后则处于事件目标阶段,之后会在向上冒泡,进入事件的冒泡阶段...触碰完成以后再把手拿出来,正好是一个相反的过程,这就与我们的事件机制是一个道理。 事件绑定 下面来看一下下面这个示例代码: <!...(在添加注册事件时,第三个参数为true则代表接受捕获事件。)...2 currentTarget 返回其事件监听器触发该事件的元素。 2 eventPhase 返回事件传播的当前阶段。

1.5K20

JS 事件循环 Node 篇

JS 事件循环 Node 篇 之前介绍过浏览器中的事件循环,本文将详细介绍 Node 中的事件循环。...根据 Node.js 官方介绍,每次事件循环都包含了6个阶段,如下图所示 image-20220404145555012 「注意」:每个框被称为事件循环机制的一个阶段。...所以咧,在poll阶段event loop会有一个检查机制,检查timer队列是否为空,如果timer队列非空,event loop就开始下一轮事件循环,即重新进入到「timers阶段」。...浏览器端 而在Node.js中,microtask会在事件循环的各个阶段之间执行,也就是一个阶段执行完毕,就会去执行microtask队列的任务。...总结 Node.js事件循环分为6个阶段 浏览器和Node 环境下,microtask任务队列的执行时机不同 Node.js中,microtask 在事件循环的各个阶段之间执行 浏览器端,microtask

2.2K10

node.js 事件循环

Node的线程会保持一个事件循环,当有任务完成时,他会触发相应的事件,通知事件监听函数执行。      事件驱动程序      node.js大量的使用事件,这也是和其他相同技术相比更快的原因。...当Node被启动时,初始他的变量,和声明方法,而后等待事件的发生。      在一个事件驱动应用程序内,一般会有一个主要的循环用于事件监听,当有一个事件被发现就会触发相应的回调函数。  ?   ...事件循环和回调(callback)特别像,他们的不同之处在于,回调函数(callback)只有在异步函数执行完后才被会被执行调用,而事件处理工作于观察者模式。...监听事件行为的函数就像观察者,当有一个事件被触发,它的监听函数就开始执行。通过内置的事件模块和EventEmitter类可以使用很多Node.js内置事件。...还有一篇讲事件循环的文章很不错,有时间 大家可以读一下: https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop

3K60

Node.js 事件循环

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。...Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。...Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. ---- 事件驱动程序 Node.js 使用事件驱动模型...(这也称之为非阻塞式IO或者事件驱动IO) 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。 整个事件驱动的流程就是这么实现的,非常简洁。...Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例: // 引入 events 模块 var events =

3.4K30

JS串行和事件循环

当中的事件循环这个东西了,还要了解一下 JS 当中的同步代码和异步代码。...同步代码和异步代码除了 "事件绑定的函数" 和 "回调函数" 以外的都是 同步 代码。...程序运行会从上至下依次执行所有的同步代码在执行的过程中如果遇到异步代码会将异步代码放到事件循环中当所有同步代码都执行完毕后, JS 会不断检测事件循环中的异步代码是否满足条件一旦满足条件就执行满足条件的异步代码首先来看一个事件循环的这么一个东西吧...同步代码 alert("BNTang"); 如上的示例代码如果 alter 这一行同步代码没有执行完毕,那么事件循环当中的异步代码就不会被执行...JS 会去不断的去事件循环当中判断有没有满足条件的异步代码然后进行执行异步代码当中的内容。

13000

javascript事件循环机制–event loop

JS最初被设计用在浏览器中是单线程,因为如果浏览器中的JS是多线程的,会出现下面这个矛盾点: 那么现在有2个进程,process1 process2,由于是多进程的JS,所以他们对同一个dom,同时进行操作...答案就是是通过的事件循环(event loop),理解了event loop机制,就理解了JS的执行机制。...以上的三步基本上就构成了一个事件循环机制--event loop。 当然这并不是一个完整的时间循环机制,其中的异步任务也有宏任务和微任务的区别。...这就是一个完整的时间循环机制。...看完上面的循环机制,再来看下面这这段代码: setTimeout(function(){ console.log('定时器开始啦') }); new Promise(function(resolve

50140

JS中的事件循环机制与宏队列、微队列笔记

作为一门浏览器脚本语言,它的主要用途就是操作DOM和与用户交互设计,如果说js是多线程的话,那么它在操作DOM的时候,一个线程对DOM进行了新增操作,另一个线程对DOM进行了删除操作,那么这个时候js的处理将会变得十分复杂...1.3-事件循环 主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。...bg2014100802.png 主线程在运行的时候,产生堆和栈,栈中的代码调用外部的API,它们会在“任务队列”中加入各种事件。...宏队列:dom事件回调、ajax回调、定时器回调 微队列:promise回调、mutation回调 因此JS执行时首先必须执行所有的初始化同步任务代码,执行完以后,每次准备取出第一个宏任务执行之前,都要将所有的微任务一个一个取出来执行

1.9K30

Node.js事件循环

介绍 事件循环是了解 Node.js 最重要的方面之一。 为什么这么重要?...因为它阐明了 Node.js 如何做到异步且具有非阻塞的 I/O,所以它基本上阐明了 Node.js 的“杀手级应用”,正是这一点使它成功了。...通常,在大多数浏览器中,每个浏览器选项卡都有一个事件循环,以使每个进程都隔离开,并避免使用无限的循环或繁重的处理来阻止整个浏览器的网页。 该环境管理多个并发的事件循环,例如处理 API 调用。...Web 工作进程也运行在自己的事件循环中。 主要需要关心代码会在单个事件循环上运行,并且在编写代码时牢记这一点,以避免阻塞它。...阻塞事件循环 任何花费太长时间才能将控制权返回给事件循环的 JavaScript 代码,都会阻塞页面中任何 JavaScript 代码的执行,甚至阻塞 UI 线程,并且用户无法单击浏览、滚动页面等。

2.7K20
领券