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模拟面向对象全解(一、类型及传递)
Jul 13 Javascript
利用VUE框架,实现列表分页功能示例代码
Jan 12 Javascript
深入浅析Node.js单线程模型
Jul 10 Javascript
关于react中组件通信的几种方式详解
Dec 10 Javascript
vue-router 组件复用问题详解
Jan 22 Javascript
vue实现简单loading进度条
Jun 06 Javascript
js+canvas实现验证码功能
Sep 21 Javascript
vue初始化动画加载的实例
Sep 01 Javascript
webpack 3.X学习之多页面打包的方法
Sep 04 Javascript
Vue实现的父组件向子组件传值功能示例
Jan 19 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 Javascript
微信小程序实现上传照片代码实例解析
Aug 04 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 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
详解javascript事件冒泡
2016/01/09 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
详解React中的组件通信问题
2017/07/31 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
Python中类的初始化特殊方法
2017/12/01 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
python基础梳理(一)(推荐)
2019/04/06 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
自我评价优缺点范文
2015/03/11 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书
nginx常用配置conf的示例代码详解
2022/03/21 Servers