[TOC]

Event Loop事件循环机制

定义

浏览器或node的一种解决javascript单线程运行时不会阻塞的机制,也就是我们经常使用异步的原理。

不同的实现

浏览器Event Loop是在html5的规范中明确规定,HTML5只是定义了浏览器中Event Loop的模型,具体的实现留给了浏览器。
NodeJs的Event Loop是基于libuv实现的。

浏览器的Event Loop

一个函数执行栈、一个事件队列、一个微任务队列。

一、事件循环:它是一个在JavaScript引擎等待任务,执行任务和进入休眠等待更多任务这几个状态之间转换的无限循环。
二、引擎的一般算法
1、当有任务时
(1)从最先进入的任务开始执行。
2、休眠直到出现任务,然后转到第1步。
三、更详细的事件循环算法
1、从宏任务队列(例如 “script”)中出队(dequeue)并执行最早的任务(一个宏任务)。

  • 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中

2、宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
3、微任务执行完毕,开始检查渲染,如果有则GUI线程接管渲染。
4、渲染执行完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)

  • 如果宏任务队列为空,则休眠直到出现宏任务。

5、转到步骤 1。
Event Loop事件循环机制 - 图1

三、当我们浏览一个网页时就是上述这种形式。JavaScript 引擎大多数时候不执行任何操作,它仅在脚本/处理程序/事件激活时执行。
1、任务示例

  • 脚本:当外部脚本