2016-09-18 103 views
6
function test(){ 
    setTimeout(function(){ 
    var now=new Date(); 
    while((new Date()).getTime() < now.getTime()+5000){ } 
    console.log('p') 
    }, 0); 
} 

test(); 
test(); //it takes 10 seconds,the second test function runs after the first finished. 

有人可以向我解釋它是如何工作的嗎?爲什麼setTimeout代碼被阻止?

+0

JavaScript並不是「多線程」;該功能以串行方式執行,而不是並行執行 –

回答

5

發生這種情況的原因是,無論何時您在setTimeout中傳遞function並調用它,傳遞的函數將根據所提供的延遲(毫秒)推入callBack隊列。回調隊列中的函數將按照它們推送的順序逐個執行。因此,在這種情況下,您通過運行while循環來阻止存在於callBack隊列中的function的代碼流。因此第二次電話test需要10秒鐘才能執行。

test(); //call 1 
callBack queue ----> [function(){ while(){} }] 

test(); //call 2 
callBack queue ----> [function(){ while(){} }, function(){ while(){} }] 

注意:回調隊列將在調用堆棧中沒有任何內容執行時開始執行。

給您最佳解答,Event Loop

+0

那麼,while(){}'中的代碼不會同時被執行? – lx1412

+0

@ lx1412是的,callBack隊列中的函數將作爲普通數組內部函數的正常執行來執行。逐個。 –

2

如果你想你有異步遞歸來取代你的同步while環非阻塞實現:

function test(x){ 
 
    setTimeout(function loop(now) { 
 
    (new Date()).getTime() < now.getTime()+2000 
 
    ? setTimeout(loop, 0, now) 
 
    : console.log('p', x); 
 
    },0, new Date()) 
 
} 
 

 
test(1); 
 
test(2);

相關問題