什么是Event Loop
JavaScript 是单线程运行的,为了解决单线程运行阻塞问题,用到了计算机系统的一种运行机制,这种机制就叫做事件循环(Event Loop)。在执行同步代码时,如果遇到异步事件,js 引擎并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈中的其他任务。同步任务进入主线程,即主执行栈,异步任务进入任务队列。
Event Loop 执行顺序:
- 执行栈选择最先进入队列的宏任务(一般都是script),执行其同步代码直至结束;
- 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中。
- 检查是否存在微任务,有则会执行至微任务队列为空;然后有必要会渲染页面
- 开始下一轮Event Loop,执行宏任务中的异步代码(如setTimeout等回调)
宏任务和微任务分别有哪些?
- 微任务包括: promise 的回调、node 中的 process.nextTick 、对 Dom 变化监听的 MutationObserver。
- 宏任务包括: script 脚本的执行、setTimeout ,setInterval ,setImmediate 一类的定时事件,还有如 I/O 操作、UI 渲染等。