JS是單線程語言,深入理解JS裡的Event Loop,本文主要和大家分享JS事件輪詢機制,希望能幫助大家。
1.首先判斷JS是同步還是非同步,同步就進入主行程,非同步就進入event table
2.異步任務在event table中註冊函數,當滿足觸發條件後,被推入event queue
3.同步任務進入主線程後一直執行,直到主線程空閒時,才會去event queue中查看是否有可執行的非同步任務,如果有就推入主進程中
1.執行一個巨集任務,過程中如果遇到微任務,就將其放到微任務的【事件佇列】裡
2.目前巨集任務執行完成後,會查看微任務的【事件佇列】,並將裡面全部的微任務依序執行完
1.macro-task(巨集任務):script,setTimeout,setInterval
2.micro-task(微任務):Promise,process.nextTick
我們從一道小題目出發
for (var i=0;i<=5;i++){ setTimeout(()=>{console.log(i)},1000) }
輸出結果應該是1s之後連續列印6個6,雖然這個題目的主要知識點是區塊級作用域,但非常適合用來引出事件輪詢機制。因為setTimeout是非同步任務,所以不會立即執行,它需要等到所有的同步任務執行完畢,也就是for迴圈結束,當i變成6時開始同時執行6個定時器,此時i指向值為6的全域變量,所以列印6,這就是JS執行機制(一)
加點難度,考慮JS執行機制(二)
// promise里面的函数是立即执行的// 分别输出 2 3 5 4 1setTimeout(function () { console.log(1) },0);new Promise(function executor(resolve) { console.log(2); for(var i=0;i<10000;i++){ i==9999 && resolve(); } console.log(3); }).then(function () { console.log(4); }); console.log(5);
首先執行的第一個巨集任務肯定是腳本(script ),所以定時器會被跳過(不論你延遲幾秒執行),緊接著執行Promise裡面的內容,按順序執行,先打印2,然後進行for循環,resolve()是異步回調函數,屬於異步執行的內容,同時如我們在任務分割裡面提到的,Promise屬於微任務,所以會在巨集任務結束之後清空微任務事件佇列,所以接下來會列印3,5,4。
至此第一個巨集任務便處理完畢,然後才會輪到計時器。
以上是JS事件輪詢機制講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!