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 相关文章推荐
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
IE无法设置短域名下Cookie
Sep 23 Javascript
jquery中event对象属性与方法小结
Dec 18 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
May 08 Javascript
jQuery中extend函数的实现原理详解
Feb 03 Javascript
JS实现从连接中获取youtube的key实例
Jul 02 Javascript
javascript图片预览和上传(兼容IE)
Mar 15 Javascript
基于Jquery Ajax type的4种类型(详解)
Aug 02 jQuery
vue实现nav导航栏的方法
Dec 13 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
Mar 15 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
Jul 31 Javascript
vue递归组件实战之简单树形控件实例代码
Aug 27 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下几种删除目录的方法总结
2007/08/19 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
jquery select下拉框操作的一些说明
2010/04/02 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
对于Python装饰器使用的一些建议
2015/06/03 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
Python中如何引入第三方模块
2020/05/27 Python
html5的canvas实现3d雪花飘舞效果
2013/12/27 HTML / CSS
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
建筑班组长岗位职责
2014/01/02 职场文书
大型车展策划方案
2014/02/01 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
借款协议书范本
2014/04/22 职场文书
市场调查策划方案
2014/06/10 职场文书
前台接待岗位职责
2015/02/03 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis