1. 程式人生 > >JS程式碼執行機制---事件迴圈(EVENTLOOP)

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。