JS事件循环机制 eventloop

2021-11-26  本文已影响0人  Marshall3572

如何理解JS事件的循环机制(浏览器端)
答:

在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,但关键步骤如下:

宏任务
浏览器为了能够使得JS内部(macro)task与DOM任务能够有序的执行,会在一个(macro)task执行结束后,在下一个(macro)task 执行开始前,对页面进行重新渲染,流程如下:

(macro)task->渲染->(macro)task->...

宏任务包括

script(整体代码)
setTimeout
setInterval
I/O
UI交互事件
postMessage
MessageChannel
setImmediate(Node.js 环境)

微任务
microtask,可以理解是在当前 task 执行结束后立即执行的任务。也就是说,在当前task任务后,下一个task之前,在渲染之前。
所以它的响应速度相比setTimeout(setTimeout是task)会更快,因为无需等渲染。也就是说,在某一个macrotask执行完后,就会将在它执行期间产生的所有microtask都执行完毕(在渲染前)。

微任务包含

Promise.then
Object.observe
MutaionObserver
process.nextTick(Node.js 环境)
 setTimeout(function f1(){
     console.log(1)

     Promise.resolve().then(function f2(){
         setTimeout(function f3(){
         console.log(3)
         })
         console.log(2)
     })
     })

     setTimeout(function f4(){
     console.log(4)

     Promise.resolve().then(function f5() {
         setTimeout(function f6() {
         console.log(5)
         })
         console.log(6)
     })
     })

Chrome

setTimeout ==》 一会(宏)
.then(fn) ==》马上(微)

new Promise(fn)中,fn是马上执行的,相当于fn()

例题: 注意:不管是否resolve,.then后边的函数都会加入执行队列。resolve还是reject只区别于执行第一个(resolve)还是第二个(reject)函数。
上一篇 下一篇

猜你喜欢

热点阅读