【运行机制】 JavaScript的事件循环机制总结 eventLoop
0、从个例子开始
//code-01
console.log(1)
setTimeout(() => {
console.log(2);
});
console.log(3);
稍微有点前端经验的人都知道这段代码输出的应该是 1 3 2,因为setTimeout函数是异步执行。
那么都说js语言是单线程的,就是说是一件事从头到尾做完,那么它是怎么做到异步的呢?
这就要说到浏览器的运行机制了。
1、浏览器的基本机制
关于这部分内容目前了解不是很多,以后有时间再补上详细的内容。浏览器进程大致分为如下几个部分(从其他地方拷的图):

我们所说的js单线程,是指浏览器的js引擎线程只有一个,用来执行js的代码,而浏览器的定时触发器线程和事件触发器线程结合,可以实现js语言的异步逻辑。那么js到底是怎么执行异步操作的呢?
我们来看下面这张流程图:
2、js语言事件循环机制-基础

我们来根据以上流程图,再来看 上面代码 code-01,
1.代码开始执行,遇到console.log(1) ,打印 1
2.代码继续执行,遇到setTimeout,此为异步任务,交给异步处理模块(这里可能是定时触发器线程),因为没有延迟时间,所以console.log(2)很快加入到了事件队列中,因为同步任务没有执行完,所以现在不能执行
3.代码继续执行,遇到console.log(3),打印 3
4.代码同步任务执行完毕,查看事件队列中是否有任务,发现有console.log(2),于是打印 2
3、js语言事件循环机制-宏任务与微任务
经过上面的分析,我们对 事件循环机制有了初步的了解,现在我们再来看一个例子:
// code-02
console.log(1)
setTimeout(() => {
console.log(2);
});
new Promise(function(resolve){
console.log(3)
resolve()
}).then(function(){
console.log(4)
})
console.log(5);
上面代码的结果为1 3 5 4 2,
我们知道 promise.then和setTimeout都是异步事件,那为什么then会比setTimeout先执行呢?
其实是因为上面流程图中 事件队列 其实应该分为 宏任务队列和微任务队列,微任务优先于宏任务,而且要等微任务队列清空,才会去取宏任务队列中的任务。
所以以上流程图应改为:

我们再来根据以上更新的流程图,再来看 上面代码 code-02,
1.代码开始执行,遇到console.log(1) ,打印 1
2.代码继续执行,遇到setTimeout,此为异步任务,交给异步处理模块,因为没有延迟时间,所以console.log(2)很快加入到了宏任务队列中
3.代码继续执行,遇到console.log(3),打印 3
4.代码继续执行,遇到then函数,此为异步任务,交给异步处理模块,因为promise马上就resolve,所以console.log(4)很快加入到了微任务队列中
5.代码继续执行,遇到遇到console.log(5) ,打印 5
6.代码同步任务执行完毕,查看微任务队列中是否有任务,发现有console.log(4),于是 打印 4
7.微任务队列被清空,查看宏任务队列中是否有任务,发现有console.log(2),于是 打印 2
那么到底有哪些异步任务是宏任务,哪些是微任务呢?
常见的宏任务
1.script代码(整体的外层代码其实就是第一个宏任务)
2.setTimeout,setInterval,setImmediate
3. i/o事件
4. UI事件,比如点击事件
常见的微任务
promise
process.nextTick(Node.js)
4、最后一个例子 - 最少延迟时间
我们再来看最后一个例子
setTimeout(() => {
console.log(1);
},2);
setTimeout(() => {
console.log(2);
},1);
setTimeout(() => {
console.log(3);
},0);
运行结果为 2 3 1
可能会有人疑惑,照以上的逻辑,不应该是 3 2 1吗? 这是因为 setTimeout官方给出的规定是:最低延迟为 4ms,(这个有限制条件,但没怎么看懂)
但这个最低时间不同环境好像实现的不太一样
就上面代码而言,在Chorme浏览器中,最低延迟1ms,就是说 0ms 和 1ms 是同样的,
所以根据代码顺序,console.log(2)比console.log(3)先进入 宏任务队列
5、总结
- js是单线程,只能顺序执行代码, 但是浏览器有其他线程可以处理异步情况
- js引擎执行代码时,遇到同步任务则顺序执行,遇到异步任务则交由
异步事件处理模块处理异步事件处理模块等事件触发条件达成后,将异步任务分别 加入宏任务队列和微任务队列- 同步任务执行完毕后,先执行
微任务队列任务,等队列清空时,执行宏任务队列- 每一个
宏任务重复 2 步骤
参考
1.Event Loop的规范和实现
2.这一次,彻底弄懂 JavaScript 执行机制
3.setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop
【运行机制】 JavaScript的事件循环机制总结 eventLoop的更多相关文章
- JavaScript 运行机制:Event事件循环机制
JavaScript Event事件循环机制 JS是单线程的,浏览器只分配一个主线程给JS.一次只能执行一个任务,当前任务执行完后在可以执行下一个任务.任务多时,就会形成任务队列排队等待执行.但是非常 ...
- JavaScript的事件循环机制浅析
前言 JavaScript是一门单线程的弱类型语言,但是我们在开发中,经常会遇到一些需要异步或者等待的处理操作. 类似ajax,亦或者ES6中新增的promise操作用于处理一些回调函数等. 概念 在 ...
- javascript的事件循环机制
JavaScript是一门编程语言,既然是编程语言那么就会有执行时的逻辑先后顺序,那么对于JavaScript来说这额顺序是怎样的呢? 首先我们我们需要明确一点,JavaScript是单线程语言.所谓 ...
- 深入理解JavaScript事件循环机制
前言 众所周知,JavaScript 是一门单线程语言,虽然在 html5 中提出了 Web-Worker ,但这并未改变 JavaScript 是单线程这一核心.可看HTML规范中的这段话: To ...
- 关于javascript的事件执行机制理解
理解javascript事件执行机制 众所周知,js是一个单线程的语言,这意味着同一时间只能做一件事,但是我们又说js是异步的.首先,单线程并不是没有优点.作为浏览器脚本语言,JavaScript 的 ...
- 深入浅出Javascript事件循环机制
一.JS单线程.异步.同步概念 众所周知,JS是单线程(如果一个线程删DOM,一个线程增DOM,浏览器傻逼了-所以只能单着了),虽然有webworker酱紫的多线程出现,但也是在主线程的控制下.web ...
- 对javascript EventLoop事件循环机制不一样的理解
前置知识点: 浏览器原理,浏览器内核5种线程及协作,JS引擎单线程设计推荐阅读: 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 [FE]浏览器渲染引擎「内核」 js异步编程,Promise ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 事件循环机制(event loop)
JavaScript 事件循环机制 (event loop) 本篇文章已经默认你有了基础的 ES6 和 javascript语法 知识. 本篇文章比较细致,如果已经对同步异步,单线程等概念比较熟悉的读 ...
- javascript事件循环机制 浅尝手记
引入 众所周知Javascript是一个单线程的机制,虽然可以依托多线程的浏览器实现页面如何实现页面复杂的渲染.事件响应,但仍不会改变其单线程的本质:所以对于js的事件循环机制的了解是一个前端人员的必 ...
随机推荐
- (一)廖师兄springboot微信点餐SQL建表脚本
数据库设计 数据库表之间的关系 类目表(product_category) 商品表(product_info) 订单主表(order_master) 订单详情表(order_detail) 卖家信 ...
- bWAPP----HTML OS Command Injection - Blind
OS Command Injection - Blind 先上代码,他判断了win还是linux然后进行了ping但是结果并没有返回. 1 <div id="main"> ...
- CentOS 6.10 安装mysql
1.检查是否安装有mysql rpm -qa | grep mysql 使用yum remove 包 的方式删除干净 2.下载yum Repository wget -c http://dev.m ...
- 循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理
在我们很多模块里面,都需要使用到一些诸如图片.Excel文件.PDF文件等附件的管理,一般我们倾向于把它独立为一个公用的附件管理模块,这样可以有效的统一管理附件的信息.本篇随笔介绍附件内容的管理,包括 ...
- FL Studio钢琴卷轴之画笔工具
在FL Studio中,钢琴卷轴窗口是制作音乐很重要的一个窗口,大部分音乐编辑的工作都要在该窗口中完成.钢琴卷轴的概念来源于旧时自动机械钢琴所使用的纸质卷轴,在钢琴卷轴中,纵轴代表音符的高度,横轴代表 ...
- 教你用Camtasia制作精美片头
大家都知道在视频播放中,如果有一个令人印象深刻的精彩开头,整个视频的内容都能因此得到不少升华.所以有一个好的片头对于视频的制作来说十分重要.今天我们就来讲一下用Camtasia制作片头的方法. 首先, ...
- 如何使用ABBYY FineReader处理文档图像的缺陷?
通过扫描仪或者数码相机获取的图像文件,容易出现文本扭曲.页面歪斜等缺陷,会影响到OCR的识别质量.此时,用户可使用ABBYY FineReader 15(Windows系统)OCR文字识别软件的自动和 ...
- 文档丢失不用怕,EasyRecovery帮你一键恢复
我们在使用电脑的过程中,有时会因为各种原因,导致我们所写的文档丢失了.遇到这种情况,该怎么办呢? 下面,就给大家分享一下用EasyRecovery如何恢复被丢失的文档. 1.双击进入EasyRecov ...
- 对于char,short和byte类型的运算
对于char,short和byte这些类型在计算时都会提升到int型来计算,所以a+b=3(这个3是int型的,所以我们需要将它强转成为byte类型,才不会出错.但是使用 += 或者 ++ 运算符可以 ...
- iOS问题:pch not found
问题描述: clang: error: no such file or directory: '/Users/apple/Desktop/迅点App_Mark/FaceHelp/FaceHelp-Pr ...