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 相关文章推荐
filemanage功能中用到的lib.js
Apr 08 Javascript
鼠标滚轮控制网页横向移动实现思路
Mar 22 Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 Javascript
jquery马赛克拼接翻转效果代码分享
Aug 24 Javascript
Node.js实现兼容IE789的文件上传进度条
Sep 02 Javascript
JS实现多张图片预览同步上传功能
Jun 23 Javascript
Vue项目数据动态过滤实践及实现思路
Sep 11 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
Feb 13 Javascript
微信小程序实现购物车代码实例详解
Aug 29 Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
Nov 03 Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
解决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/01/02 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
在Linux下调试Python代码的各种方法
2015/04/17 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
python 字典套字典或列表的示例
2019/12/16 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Python中zip函数如何使用
2020/06/04 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
python 实现批量图片识别并翻译
2020/11/02 Python
企业项目策划书
2014/01/11 职场文书
幼儿园教师培训制度
2014/01/16 职场文书
元旦联欢会感言
2014/03/04 职场文书
投标保密承诺书
2014/05/19 职场文书
大学生标准自荐书
2014/06/15 职场文书
最美护士演讲稿
2014/08/27 职场文书
审计班子对照检查材料
2014/08/27 职场文书
农行心得体会
2014/09/02 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
北京爱情故事观后感
2015/06/12 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
小学二年级语文教学反思
2016/03/03 职场文书