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。
