JavaScript事件循环及宏任务微任务原理解析


Posted in Javascript onSeptember 02, 2020

首先看一段代码:

JavaScript事件循环及宏任务微任务原理解析

打印顺序是什么?

正确答案:script start, script end, promise1, promise2, setTimeout

其中涉及到事件循环(event loop),宏任务(macrotask),微任务(microtask)

一、事件循环 Event Loop

程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。

所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。

同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;

异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

一般而言,异步任务有以下三种类型:

1、普通事件,如click、resize等

JavaScript事件循环及宏任务微任务原理解析

2、资源加载,如load、error等

JavaScript事件循环及宏任务微任务原理解析

3、定时器,包括setInterval、setTimeout等

JavaScript事件循环及宏任务微任务原理解析

事件循环具体过程就是:

  • 同步任务进入主线程,异步任务进入Event Table并注册函数。
  • 当异步任务完成时,Event Table会将这个函数移入Event Queue。
  • 主线程内的任务执行完毕执行栈为空,会去Event Queue读取对应的函数,进入主线程执行。
  • 上述过程会不断重复,也就是常说的Event Loop(事件循环)。

二、宏任务与微任务

在JavaScript中,任务被分为两种,一种宏任务(MacroTask),一种叫微任务(MicroTask)。

2.1MacroTask(宏任务)

宿主环境提供的(浏览器和node)

script全部代码、setTimeout、setInterval。

浏览器为了能够使得JS内部task与DOM任务能够有序的执行,会在一个task执行结束后,在下一个 task 执行开始前,对页面进行重新渲染 (task->渲染->task->...)

2.2MicroTask(微任务)

语言标准提供的

Promise、await

async函数表示函数里面可能会有异步方法,await后面跟一个表达式,async方法执行时,遇到await会立即执行表达式,然后把await表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行

async function foo() {
  var a = await new Promise((resolve) => {
    setTimeout(() => {
      resolve(1);
    }, 2000);
  });
  console.log(a); // 第2秒时输出: 1
}
foo();

2.3宏任务与微任务执行顺序:

  • 执行栈在执行完同步任务后,查看执行栈是否为空,如果执行栈为空,就会去检查微任务队列是否为空,如果为空的话,就执行宏任务,否则就一次性执行完所有微任务。
  • 每次单个宏任务执行完毕后,检查微任务队列是否为空,如果不为空的话,会按照先入先出的规则全部执行完微任务后,设置微任务队列为null,然后再执行宏任务,如此循环。

总结:同步—>微任务—>宏任务

JavaScript事件循环及宏任务微任务原理解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
May 07 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
JavaScript之Object类型介绍
Apr 01 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
Dec 23 Javascript
AngularJS 日期格式化详解
Dec 23 Javascript
原生JS实现跑马灯效果
Feb 20 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
浅谈Vue2.0父子组件间事件派发机制
Jan 08 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
浅析vue-router原理
Oct 19 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
Dec 06 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
Sep 02 #Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 #Javascript
JavaScript this关键字指向常用情况解析
Sep 02 #Javascript
JavaScript arguments.callee作用及替换方案详解
Sep 02 #Javascript
JavaScript Array.flat()函数用法解析
Sep 02 #Javascript
通过实例解析JavaScript常用排序算法
Sep 02 #Javascript
手把手教你实现 Promise的使用方法
Sep 02 #Javascript
You might like
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
PHP XML备份Mysql数据库
2009/05/27 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
JS的数组的扩展实例代码
2008/07/09 Javascript
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
javascript控制台详解
2015/06/25 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
汽车驾驶求职信
2013/10/25 职场文书
大学生村官工作感言
2014/01/10 职场文书
奖学金感谢信
2015/01/21 职场文书
法律意见书范文
2015/05/20 职场文书
房屋质量投诉书
2015/07/02 职场文书
python如何进行基准测试
2021/04/26 Python
一文搞懂php的垃圾回收机制
2021/06/18 PHP
Python中的pprint模块
2021/11/27 Python