Tasks, microtasks, queues and schedules:
https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

Event Loop

Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。

由于Js 是单线程,但是一些高耗时操作就带来了进程阻塞问题。为了解决这个问题,Js 有两种任务的执行模式:同步模式(Synchronous)和异步模式(Asynchronous)
在异步模式下,创建异步任务主要分为宏任务与微任务两种。ES6 规范中,宏任务(Macrotask) 称为 Task, 微任务(Microtask) 称为 Jobs。宏任务是由宿主(浏览器、Node)发起的,而微任务由 JS 自身发起。

微任务的执行优先于宏任务

宏任务微任务

宏任务(Macrotask) 微任务(Microtask)
setTimeout Promise.[ then/catch/finally ]
setInterval process.nextTick(Node环境 )
script(整体代码块) queueMicrotask
I/O,事件队列 MutationObserver(浏览器环境)
setImmediate(Node环境) requestAnimationFrame(有争议)
MessageChannel

image.png异步函数执行的时候,先将宏任务加入Event Table,然后查找微任务,将微任务加入Event Table
输出时,首先将微任务加入到Event Queue ,然后再试宏任务进去Event Queue。

堆,栈、队列

image.png
Heap 堆
stack栈 先进后出
queue队列 先进先出

解释了宏任务和微任务的问题,先进去的宏任务,和后进去的微任务满足栈的先进后出的方式
所以微任务先被推进了事件队列 Event queue去执行任务 ,最后再是宏任务从栈中取出进入队列执行