2017-04-11 67 views
0

是否有可能在循環執行塊之後調用延遲爲0ms的超時函數setTimeout(function, 0)或者首先完成圍繞功能塊總是JavaScript執行塊和消息隊列

setTimeout(function(){ //something in here }, 0); 

function myFunction() { 
    // do something 
    // loop block 

    // could timeout = 0 be scheduled to execute here? 

    // do more things 
} 

myFunction() 

在我的上下文(角2),這將是有趣知道是否角的ApplicationRef.tick(),檢查數據綁定/組件的變化,之前我完成了操縱雙向綁定的財產可能被稱爲在嵌套循環?

函數調用和所有後續的子函數調用是否等於消息隊列中的單個項目,還是分解爲每個執行消息隊列中的單個項目?因此setTimeout(..., 0)可能進入隊列中的執行塊之間?

+2

如果您想了解更多關於JS調用堆棧,爲什麼異步代碼一旦同步代碼運行完畢後總是叫,我鼓勵你[觀看這精彩演講( https://youtu.be/8aGhZQkoFbQ)。 – Riron

回答

2

不,這是不可能的。您可以將javaScript視爲「一個線程」 - 在任何時間點只能運行一個代碼。任何超時將在當前流程結束後執行。 此外,當執行JavaScript頁面變得無響應 - 你不能做任何行動。

一些示範:

setTimeout(function() { console.log(1) }); 
var d = new Date(); 
var i = 0; for(; i < 1e9; i++) {} 
console.log(i); 
console.log('Passed ' + (new Date() - d)); 

>> 1000000000 
>> Passed ~2000 
>> 1 
+0

謝謝,知道它是「單線程」,但不確定是否JS引擎分解了執行塊並排隊,在這種情況下可以在最近的點插入超時。但我明白那不是這種情況。再次感謝。 – Stevanicus