1、事件循环

大家都知道JavaScript是一门单线程语言

大白话讲一下吧:什么是单线程呢,就是主线程在执行代码时,只能从上往下一行一行执行,如果执行到某一行花费了很长时间,那么,呵呵,没办法,后面的代码只能等着,如果执行到某一行,代码出错了,呵呵,后面的也得不到执行。

但是,这样肯定不行的。所以JavaScript引入了同步异步的概念,把比较耗时的代码放到异步API中执行,不要去阻塞主线程。也就有了**事件循环(Event Loop)**的概念

事件循环(Event Loop):先会执行栈中的内容,栈中内容执行后执行微任务,微任务清空后再执行宏任务,宏任务会在栈中执行,不停的循环. 如果还是不懂概念,参考这里

2、用三个框框解释Event Loop

不知道大家遇到过js执行顺序的问题,什么样的组合都有,主要成员有以下几个

  • setTimeout
  • Promise
  • setImmediate
  • Process.nextTick()

每次打印出的结果都是不按套路出牌。今天,我们就用三个框框搞懂它们,请看大屏幕。

2-1、总体介绍

看图说话。图中一共三个框框,分别是红色(R)、绿色(G)、蓝色(B)。

执行顺序:先执行红框,再执行蓝框,最后执行绿框(辅助记忆:RGB)。 这里我们要记住执行顺序,以及每个框是用来干什么的。

2-2、红框

红框是调用栈,所有的代码必须在这里执行,当在这里执行代码时,如果产生了异步任务,那么就按照一定类别把该异步任务放到蓝框或者绿框里。绝对不能阻塞红框里的其他代码执行。

2-3、蓝框

蓝框里放的一个个任务叫microTask,就是微任务的意思,当红框代码执行完毕后,红框就会从蓝框中取出一个任务并执行,在执行过程中如果产生了其他异步任务,那么继续放到蓝框或者绿框里。就这样,蓝框的一个个任务都被执行了。图中列举了几个属于microTask任务的API

2-4、绿框

绿框里放的一个个任务叫macroTask,就是宏任务的意思,当蓝框里的代码 执行完毕后,红框就会从绿框里取出一个任务并执行,在执行过程中如果产生了其他异步任务,那么继续放到蓝框或者绿框里。就这样,绿框的一个个任务都被执行了。图中列举了几个属于macroTask任务的API

3、哪些是macroTask,哪些是 microTask

知道了每个框的作用以及总体的执行顺序后,该说一下,哪些API属于microTask(蓝框),哪些API属于macroTask(绿框)。

microtask主要含:Promiseprocess.nextTickMutaionObserver

maicrotask主要含:setTimeoutsetIntervalsetImmediateI/O、UI交互事件

以上列出的这些API各自属于哪个任务必须要记住。

4、练习

说了那么多,来做几个练习吧。 先来个一年级的

setTimeout(() => {//放到了绿框里console.log(2)
}, 0);new Promise(function (resolve) { resolve() }).then(function () {console.log(3)
})//放到了蓝框里console.log(1)//默认在红框里,不动
复制代码

以上代码的结果是1、3、2

解释一波吧:

  • 这段代码首先整体作为一个宏任务(macroTask)进入到红框。
  • 先遇到setTimeout,那么将其回调函数注册后分发到宏任务中,就是绿框里边。
  • 然后遇到了Promisethen函数分发微任务到微任务中,就是蓝框里。
  • 遇到console.log(),立即执行。
  • 到这里,整体代码作为第一个宏任务就执行结束了。接下来,该去蓝框看看了,发现有then,执行。
  • 然后再到绿框里拿出setTimeout的注册回调函数,执行
  • 结束。

再来一道复杂点儿的吧

console.log(1)setTimeout(() => {console.log(2);process.nextTick(function () {console.log(3);})
}, 0);process.nextTick(function () {console.log(4)
})new Promise(function (resolve) {console.log(5);resolve()
}).then(function () {console.log(6)
})
复制代码

以上代码执行结果为:1、5、4、6、2、3

分析过程留给大家吧,只要按照我们一开始说的,把所有的异步任务分门别类的放到对应的框框里,然后再按照RGB的顺序去执行,我相信,你能做对的。

3个框框带你理解EventLoop相关推荐

  1. 一文带你理解Java中Lock的实现原理

    转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...

  2. 5分钟带你理解一致性Hash算法

    转载自 5分钟带你理解一致性Hash算法 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot s ...

  3. 50行代码,带你理解梯度下降法(Gradient Descent Method)

    梯度下降法是一种常见的优化算法,在机器学习中应用很广泛.本文从代码的角度,带你理解梯度下降法. 优化算法 优化指的是改变x以最小化或最大化某个函数 f(x) 的任务.通常以最小化 f(x) 指代大多数 ...

  4. 零基础入门│带你理解Kubernetes

    条分缕析带你充分理解Kubernetes的各个细节与部分:它是什么,它如何解决 容器编排问题,它包含哪些你必须掌握的关键对象,以及如何快速上手部署使用Kubernetes. 容器的好处不胜枚举:一致的 ...

  5. linux内核通俗理解,简洁明了!高手带你理解ARM-Linux的启动过程

    原标题:简洁明了!高手带你理解ARM-Linux的启动过程 1. kernel运行的史前时期和内存布局 在arm平台下,zImage.bin压缩镜像是由bootloader加载到物理内存,然后跳到zI ...

  6. 十分钟带你理解Kubernetes核心概念

    原文地址:http://www.dockone.io/article/932 十分钟带你理解Kubernetes核心概念 本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubern ...

  7. mysql桦仔_带您理解SQLSERVER是如何执行一个查询的

    带您理解SQLSERVER是如何执行一个查询的 看这篇文章之前,阁下可以先看一下下面的文章 翻译自: 不知道是哪篇文章抄哪篇文章的 ,不管他了,我也偷他们的文章,嘎嘎嘎嘎嘎... 我将会用尽本人的所有 ...

  8. 带你理解交换机基本原理和配置

    带你理解交换机基本原理和配置 1. 交换机的定位 交换机在TCP/IP五层模型中属于数据链路层 主要是生成和传输数据帧 在网络中相邻节点之间,实现可靠的数据通信,并且控制传输速率. 2. 以太网(MA ...

  9. 不讲一点数学知识,步步图解条理清晰,手把手带你理解DBSCAN算法

    不讲一点数学知识,步步图解条理清晰,手把手带你理解DBSCAN算法 DBSCAN(Density-Based Spatial Clustering of Applications with Noise ...

  10. 手摸手带你理解 进制 字节 ASCII码 Unicode 与 字节编码(UTF-8 /16)等(下)

    手摸手带你理解 进制 字节 ASCII码 Unicode 与 字节编码(UTF-8 /16)等(上) Unicode 先讲讲这个东西的规则 Unicode 通常(不是所有)用两个字节来表示 一个字符 ...

最新文章

  1. 数据结构与算法:16 Leetcode同步练习(六)
  2. php函数变成变量,为什么我不能在PHP函数中将函数作为默认变量提供?
  3. php微信jssdk下载图片,微信JSSDK上传多张图片回调方法以及服务器端处理下载媒体...
  4. Server2003PDC迁移到Server2008R2BDC
  5. Fluid: 让大数据和 AI 拥抱云原生的一块重要拼图
  6. [JSP暑假实训] 三.MySQL数据库基本操作及Servlet网站连接显示数据库信息
  7. [Javascript] Avoid Creating floats if they are not needed
  8. linux udp端口大数据包,Linux协议栈中UDP数据报从网卡到用户空间流程总结
  9. php科学计数法转string,php如何将科学计数法转数字
  10. 走进英特尔中国研究院探索创新日:发布最新科研成果与创新策略
  11. pq 中m函数判断嵌套_压轴题的热点,二次函数与几何的结合,谁会谁吃香
  12. JAVA8新特性Optional和Stream和Localdate用法
  13. 经典排序算法(Java版)
  14. ABBYY FineReader 12PDF选项卡之图像及文字设置
  15. c#制作飘动动画窗体
  16. 利用UICollectionView实现瀑布流
  17. Tableau-热力图
  18. 如何批量给视频加文字水印?
  19. mybatis方法参数是list的批量插入
  20. 苹果系统代码汉字转拼音

热门文章

  1. 记一次mysql故障恢复
  2. 【转载】MySQL innodb_table_stats表不存在的解决方法
  3. [转]用C++实现插件体系结构
  4. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
  5. 可能促使您决定创建自定义数据绑定控件的一些原因:
  6. Python中去除字符串中空格的方法
  7. Hadoop HA详解
  8. bzoj 3530: [Sdoi2014]数数 数位dp
  9. 6个强大的AngularJS扩展应用
  10. [No00002E]关于大数据,你不知道的6个迷思