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 相关文章推荐
asp.net中System.Timers.Timer的使用方法
Mar 20 Javascript
jquery实现图片裁剪思路及实现
Aug 16 Javascript
jquery实现tr元素的上下移动示例代码
Dec 20 Javascript
node.js中的url.parse方法使用说明
Dec 10 Javascript
js焦点文字滚动效果代码分享
Aug 25 Javascript
javascript日期格式化方法小结
Dec 17 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
Oct 27 Javascript
vue cli 全面解析
Feb 28 Javascript
vue中使用element-ui进行表单验证的实例代码
Jun 22 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
Jan 21 Javascript
vue中使用props传值的方法
May 08 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
Apr 25 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中几种常见的超时处理全面总结
2012/09/11 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
vue解决使用$http获取数据时报错的问题
2019/10/30 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python实现归并排序算法
2018/11/22 Python
python pygame实现五子棋小游戏
2020/10/26 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
servlet面试题
2012/08/20 面试题
大学毕业生工作的自我评价
2013/10/01 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
师德模范事迹材料
2014/06/03 职场文书
远程培训的心得体会
2014/09/01 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
社区国庆节活动总结
2015/03/23 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书