首頁  >  文章  >  web前端  >  JS事件輪詢機制講解

JS事件輪詢機制講解

小云云
小云云原創
2018-03-26 16:33:234267瀏覽

JS是單線程語言,深入理解JS裡的Event Loop,本文主要和大家分享JS事件輪詢機制,希望能幫助大家。

JS的執行機制(一):

1.首先判斷JS是同步還是非同步,同步就進入主行程,非同步就進入event table

2.異步任務在event table中註冊函數,當滿足觸發條件後,被推入event queue

3.同步任務進入主線程後一直執行,直到主線程空閒時,才會去event queue中查看是否有可執行的非同步任務,如果有就推入主進程中

JS的執行機制(二)

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn