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


71

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

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

window.setInterval(timer(), 1000)

8
问题是timer()调用评估产生的功能对象,timer然后将结果(undefined)传递给setTimeout。因此,请勿调用它。相反,只需传递功能对象:setInterval(timer, 1000)

Answers:


116

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

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

window.setInterval(timer, 1000);

或更短(但是当函数变大时,其可读性也会下降):

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

3
答案正确指出,回调函数的参数中不应包含“()”。
克里斯蒂安

2
根据developer.mozilla.org/en/Extensions/…的说明,较短的版本可能会导致内存泄漏。
Crend King

2
@CrendKing这两个版本具有完全相同的“问题”(也用于扩展,并且不影响正常的网页/ JS),因为重要的是对象生存期

这就是为什么我说“可以”的原因,因为OP没有指定他的用例。请注意,如果它是从Mozilla扩展程序中提取的。
Crend King

1
您不能使用setInterval,但是可以使用setTimeout函数来模拟。
科恩·彼得斯

11

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

setInterval(timer, 1000);

或未命名的函数:

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

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

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

一个常见的错误是使用w3schools中显示的这两个功能。这会隐式调用eval

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.