带你彻底弄懂Event Loop(转载)

带你彻底弄懂Event Loop

浏览器的Event Loop和NodeJS的Event Loop是不同的,实现机制也不一样,不要混为一谈。
浏览器可以理解成只有1个宏任务队列和1个微任务队列,先执行全局Script代码,执行完同步代码调用栈清空后,从微任务队列中依次取出所有的任务放入调用栈执行,微任务队列清空后,从宏任务队列中只取位于队首的任务放入调用栈执行,注意这里和Node的区别,只取一个,然后继续执行微队列中的所有任务,再去宏队列取一个,以此构成事件循环。

NodeJS可以理解成有4个宏任务队列和2个微任务队列,但是执行宏任务时有6个阶段。先执行全局Script代码,执行完同步代码调用栈清空后,先从微任务队列Next
Tick Queue中依次取出所有的任务放入调用栈中执行,再从微任务队列Other Microtask
Queue中依次取出所有的任务放入调用栈中执行。然后开始宏任务的6个阶段,每个阶段都将该宏任务队列中的所有任务都取出来执行(注意,这里和浏览器不一样,浏览器只取一个),每个宏任务阶段执行完毕后,开始执行微任务,再开始执行下一阶段宏任务,以此构成事件循环。

MacroTask包括: setTimeout、setInterval、
setImmediate(Node)、requestAnimation(浏览器)、IO、UI rendering

Microtask包括:
process.nextTick(Node)、Promise、Object.observe、MutationObserver

你可能感兴趣的:(JAVASCRIPT)