为什么 setInterval 回调只执行一次?

Why does the setInterval callback execute only once?

提问人:computer_smile 提问时间:4/17/2012 最后编辑:Ivarcomputer_smile 更新时间:6/9/2018 访问量:63348

问:

我有我做的这个计数器,但我希望它永远运行,这真的很简单,我在这里做错了什么?

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

window.setInterval(timer(), 1000)
JavaScript 回调 setinterval

评论

12赞 4/17/2012
问题是调用计算产生的函数对象,然后将结果 () 传递给 。所以,不要调用它。相反,只需传递函数对象:timer()timerundefinedsetTimeoutsetInterval(timer, 1000)
0赞 Bergi 9/9/2022
对于相同的问题,请参阅此处或此处setTimeout

答:

125赞 Koen Peters 4/17/2012 #1

您使用函数调用而不是函数引用作为 setInterval 的第一个参数。这样做是这样的:

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

window.setInterval(timer, 1000);

或更短(但当函数变大时,可读性也降低):

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

评论

3赞 Kristian 4/17/2012
答案正确地指出,回调函数的参数中不应包含“()”。
2赞 Reci 4/17/2012
根据 developer.mozilla.org/en/Extensions/...,较短的版本可能会导致内存泄漏。
2赞 4/17/2012
@CrendKing 这两个版本都有完全相同的“问题”(同样,这是针对扩展的,不影响正常的网页/JS),因为对象生存期很重要。
0赞 Reci 4/17/2012
这就是为什么我说“可能”,因为 OP 没有具体说明他的用例。请注意它是否是从Mozilla扩展中提取的。
1赞 Koen Peters 3/10/2017
你不能使用 setInterval,但你可以用 setTimeout 函数来模拟它。
13赞 Bakudan 4/17/2012 #2

setInterval并且必须与回调一起使用,例如:setTimeout

setInterval(timer, 1000);

或未命名的函数:

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

为什么你的代码不起作用 - 当你将一个函数作为参数传递给另一个带有括号的函数时,例如 您正在传递函数的结果。doSomething ( someFunc() )

当函数作为对象传递时,例如 您正在传递回调。这种方式作为引用传递,并在调用函数的某个位置执行。这与指向其他语言中的函数的指针相同。doSomething ( someFunc )someFunc

一个常见的错误是使用这两个函数,如 w3schools 所示。这会隐式调用 。eval