2015-05-18 26 views
1

爲什麼setTimeoutalert(2)之後被觸發函數,即使我將時間設置爲0.我以爲javascript是同步語言。setTimeout如何在javascript中工作(理論上)

我只是想從理論上知道javascript中的異步工作。 JavaScript時interpreator遇到setTimeout然後會發生什麼,當它遇到的其他功能,那麼會發生什麼

編輯:

setTimeout(function(){ 
alert(0) 
},0) 


alert(1) 
alert(2) 
+2

有一個事件循環。檢查一下:http://ejohn.org/blog/how-javascript-timers-work/ –

+0

'setTimeout'是一個合成的延遲,並且調用的函數不會被同步調用,即使超時設置爲0它們將在當前調用堆棧被清除(即下一個事件循環迭代)後被調用(最早)。這是一件好事 - 它防止釋放[他誰承諾o҉̶nl̨͟y̧瘋狂,T̢҉̸h̴̷̸̢ȩ͘͡͠N͢͢e͏͏͢͠z̛͏͜p̸̕͠ȩ͝͝r҉̛͠d̴i̴̕҉͞a̴̡͝͠n̢͜͟͢͟蜂房̸͝m̷͜i̛͘͞ņ̛͘͟҉d̶̶̡̧͜的̶̧͟͡c̕͝h̶͘͘à͏o҉̴͢s̸͘͘͝͞(或Zalgo)](http://blog.izs.me/post/59142742143/designing-apis-for -asynchrony)。 –

+0

@amit鑑於您的編輯,預期的執行將是1,2和0的警報。 –

回答

1

JavaScript與事件循環一起執行代碼。該循環從隊列中獲取事件並執行附加的代碼。

在您當前的活動中,您撥打setTimeout並在該隊列中放置新事件。調用setTimeout立即返回(該函數未執行,只是放入隊列中)。

然後,繼續執行當前的代碼,直到完成當前事件(我假設您的電話號碼爲alert()就在這裏)。

當前事件完成後,循環會從隊列中選取下一個事件;這就是你用setTimeout設置的功能。

+0

我假設這是隊列['setTimeout','alert(1)','alert(2)']。當setTimeout遇到它時返回false然後循環進入下一個事件。所以什麼時候它會返回setTimeout。 – Carlos

+0

@amit並非如此。隊列以''[你的代碼]''開始,其中代碼是三個語句setTimeout-alert1-alert2。在執行第一個語句(setTimeout)時,你的隊列是'''[你的代碼(正在運行),alert 0]''。您的代碼繼續運行其他2個待處理語句(警報1和2)並結束。您的代碼將從隊列中移除,並執行下一個事件(警報0)。 –

+0

所以一旦他們執行他們從隊列中刪除? – Carlos

1

JavaScript是單線程的。 JS會盡量接近提供給setTimeout函數的超時時間,但只有在線程不忙於其他事情時纔會觸發(比如等待用戶在彈出的警告中點擊OK)。

所以,如果你有一個需要很長時間才能運行的JS腳本,並且它有一對夫婦,如果超時時間不同,那麼它們只能在JS線程完成該腳本中其餘代碼時觸發。

+0

如果我明白,setTimeout將添加到回調隊列中,並且瀏覽器每次都會詢問以下問題:什麼等待執行? – Carlos

+0

'alert'阻止執行(就像PHP中的'sleep'語句),所以線程實際上忙着無所事事。它只是等待用戶點擊「確定」按鈕,然後繼續下一步。我建議你閱讀評論中已經提到的鏈接中的文字。這是一個很好的閱讀。 http://ejohn.org/blog/how-javascript-timers-work/ – koenpeters