2012-04-16 96 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