2012-06-07 115 views
-2

我不明白爲什麼第二個函數調用(在函數體之後)優先於正文內部的一個函數?JavaScript中函數執行的優先級

function a(){ 
    var num = 5; 
    console.log(++num); 
    setTimeout(a, 100); 
}; 
setTimeout(a,2000) 
+1

你期望什麼行爲? – Sirko

+0

你應該寫「function a(){...}();」 (注意最後的括號)?您的代碼在最後一行之前不會調用該函數。 – tsiki

+0

我只想知道爲什麼一個電話正在等待另一個電話?然後,我將能夠預測行爲。 – carousel

回答

4

按照時間順序:

  • 您所定義功能a沒有調用它

  • 你正在計劃a兩秒鐘後調用:setTimeout(a,2000)

  • 它被稱爲

  • 當它被調用時,它本身的時間表用於調用之後100毫秒

您的代碼基本上睡2秒鐘,然後執行a用100毫秒暫停[*]

但是通過您的上下文判斷你所要求的是在下列情況下的優先級:

setTimeout(a, 2000); 
setTimeout(b, 100); 

那麼,最有可能的b稱爲第一(假設第一線和第二線之間不存在不可預知的停頓,例如由於整體OS性能問題)。

如果使用相同的超時:

setTimeout(a, 100); 
setTimeout(b, 100); 

a將最有可能首先被調用。但是我不認爲這是有保證的,取決於JS引擎(是否使用了即將發生的事件嚴格的FIFO列表,什麼是內部時鐘分辨率等)

[*]您可以實現相似行爲通過使用setInterval()一旦

+0

我打算+1,但是請省略'setInterval'部分......它在這裏做的事情很少,可能會讓您感到困惑。 – MaxArt

+0

@MaxArt:移至較小的筆記。我不認爲這是令人困惑的,但同意與腳本不相關 –

1

功能a不被調用,剛定義。實際運行的那段代碼是a的定義,然後調用setTimeout(a,2000)

0

我覺得

function a() { 
    var num = 5; 
    console.log(++num); 
    setTimeout(a, 100); 
}; 

是一個函數體並在此之後,我們在呼喚。我不認爲這是一個層次問題。