2011-11-01 64 views

回答

6

myFunction是一個功能

myFunction()調用函數和產量的任何值函數返回。

setTimeout的目的是在經過一段時間後運行代碼。你只需要傳遞函數給它(所以setTimeout本身可以在適當的時候調用函數),因爲如果你在將函數傳遞給setTimeout之前調用了函數(使用圓括號),它將執行現在而不是1秒後。

+0

哦......這很有道理。 –

17

setTimeout函數需要函數引用*作爲參數:引用是變量,並且沒有括號。

函數調用需要圓括號(即使函數不帶參數)。

果殼:myFunction是對該功能的參考。 myFunction()執行該函數,並且在表達式中,將「等於」函數的返回值(如果沒有返回值,則爲undefined)。

深入探討:有些情況下,setTimeout(myFunction(), 1000)可能是有意義的,如果myFunction()本身返回功能等。例如:

var myFunction = function() { 
    return function() { 
     alert("ohai"); 
    }; 
}; 
  • 匿名功能(包含單個return語句)被立即執行。
  • 該函數的返回值本身是一個包含alert的函數。

所以:

  • 單獨myFunction是一個函數的引用(恰好返回功能)。
  • myFunction()將執行。它評估爲功能參考,適用於setTimeout()

最後:

setTimeout(myFunction(), 1000); 

這在一秒鐘內來電myFunction()的返回值。一秒鐘後,彈出警報。

參見Why function statement requires a name?

*或字符串進行評價,但基準是優選的。

+0

他說什麼^^^^^ – JonH

+1

奇怪。 JavaScript是一種古怪的語言。 –

+2

@cf_PhillipSenn:它在Python或C(函數指針)中基本相同。只提供函數的名稱引用它。在它後面添加括號可以調用它。當然,這在函數不是第一類對象的語言中不存在,因此不能直接引用(如Java)。 –

2

在第2行,函數myFunction不叫,但作爲一個參數傳遞給setTimeout函數傳遞,而在第4行myFunction被調用;要調用某個函數,即使沒有參數,您也必須使用括號,即使總是

+1

我認爲一個25瓦的燈泡剛剛亮起。 –

5

當您使用括號時,它說「現在調用此函數」。所以如果你說setTimeout(myFunction(),1000);,它將使用該函數的返回值作爲超時回調。如果函數的返回值本身不是一個函數,那麼你會得到一個錯誤,因爲它會嘗試執行一些在超時後(字符串,數字,未定義等)不可執行的東西。

+0

啊是的。好。謝謝! –

+0

雖然,值得注意的是:如果返回的字符串是可執行的,比如說alert(「Hello world!」);'它會在這個上下文中工作,因爲'setTimeout'可以接受字符串作爲js代碼文字。 – Chris