js事件循環機制(EVENTLOOP)


JS的執行機制是一個主線程和一個任務隊列(Eventqueue),所有的同步任務都是在主線程上直接執行的。異步任務都被放在任務隊列中。(這里盜了一個圖)這時程序的執行還沒有真正的進入事件循環。

接下來異步任務的執行,就涉及到了宏任務和微任務。

所有的任務在主線程執行,會形成一個執行棧,執行棧會區分出宏任務和微任務,並把任務放在各自的任務隊列中。

宏任務一般包括整體SCRIPT代碼塊,seiTimeout,setInterval。

微任務:promise的then方法,process,nextTick。

所有的異步任務都會被分為宏任務和微任務。宏任務隊列一次只會存放一個宏任務,當宏任務隊列的任務執行完后,會執行所有的微任務。所有微任務執行完后,會進入下一個事件循環。

這是宏任務隊列會進入下一個宏任務,並執行這個宏任務。

接下來在看一個邏輯圖來加深一下理解。(也是盜的圖,略略...)

一個宏任務執行完后,執行所有的微任務,所有的微任務執行完后,再次開始執行下一個進入宏任務隊列的宏任務。這個過程就是一次事件循環。

所有任務的執行就形成整個的事件循環。大家可以讀一下下面的代碼,看看你是不是真的已經理解了事件循環。

 1 setTimeout(function(){
 2     console.log('1')
 3 });
 4 
 5 new Promise(function(resolve){
 6     console.log('2');
 7     resolve();
 8 }).then(function(){
 9     console.log('3')
10 });
11 
12 var timer;
13 timer = setInterval(function(){
14     console.log('5');
15     clearInterval(timer);
16 });
17 new Promise(function(resolve){
18     resolve();
19 }).then(function(){
20     console.log('6')
21 });
22 console.log('4');

這段代碼的執行結果是2,4,3,6,1,5。首先來分析一下思路,整體的代碼是第一個執行的宏任務,整體代碼開始執行,同步任務直接在主線程執行執行,此時打印出2,4。(Promise參數是一個同步執行的函數)

接下來執行所有的微任務,有兩個Promise的then函數,按順序執行,打印出3,6。微任務執行完,下一個宏任務進入宏任務隊列,開始被執行,打印出1。接下來沒有微任務,直接執行下一個宏任務,打印出5。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM