2012-04-16 134 views
46

我有這個計數器我做了,但我希望它永遠運行,這很簡單,我在這裏做錯了什麼?setInterval回調只運行一次

function timer() { 
    console.log("timer!") 
} 

window.setInterval(timer(), 1000) 
+6

問題是'timer()'調用由計算'timer'產生的函數對象,然後將結果('undefined')傳遞給'setTimeout'。所以,不要調用它。相反,只需傳遞函數對象:'setInterval(timer,1000)' – 2012-04-16 22:57:00

回答

76

您使用函數調用而不是函數引用作爲setInterval的第一個參數。像這樣做:

function timer() { 
    console.log("timer!"); 
} 

window.setInterval(timer, 1000); 

以下(但在功能變得更大也不易閱讀):

window.setInterval(function() { 
    console.log("timer!"); 
}, 1000) 
+1

答案正確指出回調函數不應在參數中包含「()」。 – Kristian 2012-04-16 22:42:29

+2

根據https://developer.mozilla.org/en/Extensions/Common_causes_of_memory_leaks_in_extensions#Be_careful_with_setInterval.2FsetTimeout,較短的版本可能導致內存泄漏。根據Crend King的鏈接,mozilla吮吸 – 2012-04-16 22:46:45

+0

。 – nothrow 2012-04-16 22:48:58

8

setIntervalsetTimeout必須與回調一起使用,如:

setInterval(timer, 1000); 

或未命名的功能:

setInterval(function() { console.log("timer!"); }, 1000); 

爲什麼你的代碼不工作 - 當你將一個函數作爲參數傳遞給另一個帶括號的函數時,例如: doSomething (someFunc())你正在傳遞函數的結果。

當函數作爲對象傳遞時,例如, doSomething (someFunc)你傳遞迴調。這種方式someFunc作爲參考傳遞,它在調用函數中的某處執行。這與指向其他語言的函數的指針相同。

一個常見的錯誤是使用這兩個函數,如w3schools所示。這會隱含調用eval