2012-08-01 59 views
3

工作我使用下面暫停的JavaScript幾秒鐘:設置超時不與功能

setTimeout(start_countdown(),3000); 

它不工作,無論秒的函數被調用。然而,下面的函數不起作用,它不使用函數。

setTimeout(alert('hi'),3000); 

我該如何解決這個問題?

回答

11

你需要傳遞一個函數引用。您正在傳遞函數的返回值。

區別在於:一個是您想要發生的功能的藍圖,另一個意味着您立即執行該功能並將其返回值傳遞給setTimeout

setTimeout(start_countdown, 3000); 

如果你想要做一些更復雜的比簡單地調用名爲功能,或者你想設置了一個param傳遞給指定的功​​能,你需要,而不是通過一個匿名函數超時,並致電內的功能:

setTimeout(function() { 
    start_countdown(/* possible params */); 
    /* other code here as required */ 
}, 3000); 
+0

你能解釋爲什麼我們不應該添加括號作爲函數'setTimeout'的第一個參數?我注意到,如果我們添加'()',函數將立即觸發。這是爲什麼? 我不知道'setTimeout'實際上是如何工作的...... – Stallman 2013-07-28 15:11:56

+2

'setTimeout'註冊一個異步事件,它將以您指定的毫秒數(大約)執行。它期望作爲第一個參數的一個函數 - 一個函數文字或一個對其他地方指定的引用。如果你在函數名後加上'()',那麼你實際上正在執行函數,然後不要求稍後調用該函數。您需要了解函數引用和函數調用之間的區別。 – Utkanos 2013-07-29 10:59:32

1

寫,而不是

setTimeout(start_countdown, 3000); 

沒有括號()
第二個例子可以也寫成

setTimeout(function() { alert('hi'); }, 3000); 
3

如果你不需要通過PARAMS不使用()

setTimeout(start_countdown,3000); 

如果你有來包裝你的函數

setTimeout(function(){start_countdown(parameter)},3000); 
0

在不同的瀏覽器中,它以不同的方式工作。在IE中,您需要使用匿名函數將參數傳遞給回調:

setTimeout(function(){alert('hi')},3000);