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 相关文章推荐
js tab 选项卡
Apr 26 Javascript
jcrop基本参数一览
Jul 16 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
Jul 17 jQuery
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
JavaScript使用Ajax上传文件的示例代码
Aug 10 Javascript
Router解决跨模块下的页面跳转示例
Jan 11 Javascript
Vue中父子组件通讯之todolist组件功能开发
May 21 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
Aug 07 Javascript
Webpack按需加载打包chunk命名的方法
Sep 22 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
Jul 31 Javascript
JS实现页面炫酷的时钟特效示例
Aug 14 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(1)
2006/10/09 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
通过Kettle自定义jar包供javascript使用
2020/01/29 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python中字典dict常用操作方法实例总结
2015/04/04 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
python分布式编程实现过程解析
2019/11/08 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
造型师求职自荐信
2013/09/27 职场文书
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
面料业务员岗位职责
2013/12/26 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
初中班主任寄语
2014/04/04 职场文书
工作会议方案
2014/05/21 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
大学团日活动总结书
2015/05/11 职场文书