javascript的執行機制講解

javascript的執行機制講解

setTimeout(function(){console.log(1);}, 0);
console.log(2);

這段代碼的運行結果是2,1,而不是1,2,這是因為js的執行機制。

首先,我們知道js是單線程的,即同時隻能處理一件事,但是瀏覽器是多線程的,那js為什麼不能是多線程呢,主要因為js處理用戶的簡單交互,如果同時處理多個事件就很容易造成混亂。

js處理時間可以分成主線程和任務隊列(也可以叫等待隊列),一個一個地處理主線程中的任務,等到主線程中的任務都執行完瞭,再執行等待隊列中的任務。在主線程執行過程中如果任務隊列有任務完成瞭則自動進入主線程排隊等待執行,但像定時器如果設置瞭執行時間,如果等待隊列中輪到他進入主線程執行,也要先等待他的延遲時間再進入主線程執行。主線程從任務隊列中源源不斷的讀取事件,這個過程是循環的,於是也叫事件循環Event Loop.

 var req = new XMLHttpRequest();
    req.open('GET', url);
    req.send();
    req.onload = function (){};    
    req.onerror = function (){}; 
 var req = new XMLHttpRequest();
    req.open('GET', url);    
    req.onload = function (){};    
    req.onerror = function (){};    
    req.send();

這兩段代碼結果是一樣的。

前面說的定時器,包括setTimeOut和setInterval執行機制是一樣的,比如setTimeOut(function(){},0),第一個參數是回調函數,第二個是延遲執行的毫秒數。延遲時間為0不代表不延遲,直接執行,而是在能執行的時候立即執行,即主線程和等待隊列中他前面的任務都執行完才可以。

You May Also Like