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中if语句的几种优化代码写法
Mar 12 Javascript
JQueryEasyUI datagrid框架的进阶使用
Apr 08 Javascript
页面实时更新时间的JS实例代码
Dec 18 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
Aug 15 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
JavaScript基于ajax编辑信息用法实例
Jul 15 Javascript
Javascript计算二维数组重复值示例代码
Dec 18 Javascript
基于JavaScript实现拖动滑块效果
Feb 16 Javascript
Vue实现自带的过滤器实例
Mar 09 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
Apr 12 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
Aug 22 Javascript
VUE注册全局组件和局部组件过程解析
Oct 10 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
php解决安全问题的方法实例
2019/09/19 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
JS之if语句对接事件动作逻辑(详解)
2017/06/28 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python编程中的文件操作攻略
2015/10/16 Python
python简单实现获取当前时间
2016/08/27 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
中学生差生评语
2014/01/30 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
搞笑征婚广告词
2014/03/17 职场文书
广告创意求职信
2014/03/17 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
SQL实战演练之网上商城数据库商品类别数据操作
2021/10/24 MySQL
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python