JS事件循环机制event loop宏任务微任务原理解析


Posted in Javascript onAugust 04, 2020

首先看一段代码

async function (){
		await f2()
		console.log('f1')
	}

	async function f2(){
		console.log('f2')
	}
	
	console.log('正常1')
	f1()
	setTimeout(()=>{
		console.log('定时器')
	})
	console.log('正常2')

正确的打印顺序应该是:正常1,f2 ,正常2,f1,定时器

为什么会出现这样打印顺序呢

首先javascript是一门单线程语言,在最新的HTML5中提出了Web-Worker,但javascript是单线程这一核心仍未改变。既然js是单线程,那就像只有一个窗口的银行,客户需要排队一个一个办理业务,同理js任务也要一个一个顺序执行。如果一个任务耗时过长,那么后一个任务也必须等着。所以就出现了同步任务和异步任务。

概念

除了广义的同步任务和异步任务,对任务可以进行更精细的区分

  • macro-task(宏任务):包括整体代码script,setTimeout,setInterval
  • micro-task(微任务):Promise,process.nextTick

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

鼠标点击会触发一个事件回调,需要执行一个宏任务,然后解析HTMl

微任务:微任务通常来说就是需要在当前 同步任务 执行结束后立即执行的任务,比如对一系列动作做出反馈,或者是需要异步的执行任务而又不需要分配一个新的任务,这样便可以减小一点性能的开销。

既然我们清楚了概念,我们再看一遍代码

async function (){
		await f2()
		console.log('f1')
	}

	async function f2(){
		console.log('f2')
	}
	
	console.log('正常1')
	f1()
	setTimeout(()=>{
		console.log('定时器')
	})
	console.log('正常2')

执行顺序

首先我们进行正常的同步流程,打印出‘正常1',接下来执行f1()函数,await后面的函数f2()会立即执行,所以会打印'f2',继续执行同步代码打印‘正常2',至此同步任务全部结束,开始执行异步任务微任务,await f2()等待f2()方法执行完之后打印出f1,最后执行宏任务setTimeout打印‘定时器'

这就是为什么‘正常1',正常2'会打印在‘f1'之前,因为所有微任务执行的时候,当前执行栈的代码必须已经执行完毕。‘f2','f1'会打印在‘定时器'之前是因为所有微任务总会在下一个宏任务之前全部执行完毕

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

Javascript 相关文章推荐
JavaScript面向对象之体会[总结]
Nov 13 Javascript
JS 字符串连接[性能比较]
May 10 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
Jun 19 Javascript
jquery、js操作checkbox全选反选
Mar 12 Javascript
jquery显示loading图片直到网页加载完成的方法
Jun 25 Javascript
javascript实现对表格元素进行排序操作
Nov 18 Javascript
angular.js分页代码的实例
Jul 27 Javascript
canvas实现手机端用来上传用户头像的代码
Oct 20 Javascript
canvas 弹幕效果(实例分享)
Jan 11 Javascript
Vue自定义toast组件的实例代码
Aug 15 Javascript
Vue v-bind动态绑定class实例方法
Jan 15 Javascript
vue实现列表拖拽排序的功能
Nov 02 Javascript
解决vue addRoutes不生效问题
Aug 04 #Javascript
vue 解决addRoutes多次添加路由重复的操作
Aug 04 #Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
Aug 04 #Javascript
Jquery cookie插件实现原理代码解析
Aug 04 #jQuery
解决vue自定义指令导致的内存泄漏问题
Aug 04 #Javascript
vue中的v-model原理,与组件自定义v-model详解
Aug 04 #Javascript
详解JS深拷贝与浅拷贝
Aug 04 #Javascript
You might like
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
python中PIL安装简单教程
2016/04/21 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
python读写配置文件操作示例
2019/07/03 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
简单了解python列表和元组的区别
2020/05/14 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
vscode调试django项目的方法
2020/08/06 Python
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
2013的个人自我评价
2013/12/26 职场文书
银行办理业务介绍信
2014/01/18 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
买卖合同协议书范本
2014/10/18 职场文书
作弊检讨书
2015/01/27 职场文书
经营目标责任书
2015/05/08 职场文书
导游词之太湖
2019/10/08 职场文书
5个实用的JavaScript新特性
2022/06/16 Javascript