爲什麼我可以說:何時使用括號,何時不使用括號?
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
爲什麼在setTimeout
函數調用不需要括號,但最後一行呢?
爲什麼我可以說:何時使用括號,何時不使用括號?
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
爲什麼在setTimeout
函數調用不需要括號,但最後一行呢?
myFunction
是一個功能
myFunction()
調用函數和產量的任何值函數返回。
setTimeout的目的是在經過一段時間後運行代碼。你只需要傳遞函數給它(所以setTimeout本身可以在適當的時候調用函數),因爲如果你在將函數傳遞給setTimeout之前調用了函數(使用圓括號),它將執行現在而不是1秒後。
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?
*或字符串進行評價,但基準是優選的。
他說什麼^^^^^ – JonH
奇怪。 JavaScript是一種古怪的語言。 –
@cf_PhillipSenn:它在Python或C(函數指針)中基本相同。只提供函數的名稱引用它。在它後面添加括號可以調用它。當然,這在函數不是第一類對象的語言中不存在,因此不能直接引用(如Java)。 –
在第2行,函數myFunction
不叫,但作爲一個參數傳遞給setTimeout
函數傳遞,而在第4行myFunction
被調用;要調用某個函數,即使沒有參數,您也必須使用括號,即使總是。
我認爲一個25瓦的燈泡剛剛亮起。 –
當您使用括號時,它說「現在調用此函數」。所以如果你說setTimeout(myFunction(),1000);
,它將使用該函數的返回值作爲超時回調。如果函數的返回值本身不是一個函數,那麼你會得到一個錯誤,因爲它會嘗試執行一些在超時後(字符串,數字,未定義等)不可執行的東西。
啊是的。好。謝謝! –
雖然,值得注意的是:如果返回的字符串是可執行的,比如說alert(「Hello world!」);'它會在這個上下文中工作,因爲'setTimeout'可以接受字符串作爲js代碼文字。 – Chris
哦......這很有道理。 –