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面向对象编程(一) 实例代码
Jun 25 Javascript
JavaScript对象创建及继承原理实例解剖
Feb 28 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
Feb 25 Javascript
基于jQuery ligerUI实现分页样式
Sep 18 Javascript
jQuery select自动选中功能实现方法分析
Nov 28 Javascript
关于axios返回空对象的问题解决
Apr 04 Javascript
详解如何让Express支持async/await
Oct 09 Javascript
微信分享invalid signature签名错误踩过的坑
Apr 11 Javascript
vue实现简单图片上传
Jun 30 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
Jul 17 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
Jul 31 Javascript
浏览器JavaScript调试功能无法使用解决方案
Sep 18 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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
2010/05/15 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
javascript引导程序
2008/10/26 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
2016/06/02 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
Python 的类、继承和多态详解
2017/07/16 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
对python中UDP,socket的使用详解
2019/08/22 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
sklearn+python:线性回归案例
2020/02/24 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
财务总监管理岗位职责
2014/03/08 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
事业单位岗位说明书
2015/10/08 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle