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

com*_*ile 63 javascript callback setinterval

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

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

window.setInterval(timer(), 1000)
Run Code Online (Sandbox Code Playgroud)

Koe*_*ers 103

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

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

window.setInterval(timer, 1000);
Run Code Online (Sandbox Code Playgroud)

或者更短(但是当函数变得更大而且可读性更低时):

window.setInterval( function() {
  console.log("timer!");
}, 1000)
Run Code Online (Sandbox Code Playgroud)

  • 答案正确地指出回调函数不应该在参数中有"()". (2认同)
  • 根据https://developer.mozilla.org/en/Extensions/Common_causes_of_memory_leaks_in_extensions#Be_careful_with_setInterval.2FsetTimeout,较短的版本可能会导致内存泄漏. (2认同)
  • @CrendKing两个版本都有完全相同的"问题"(也就是扩展而不影响正常的网页/ JS),因为它是*对象生命周期*. (2认同)

Bak*_*dan 9

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

setInterval(timer, 1000);
Run Code Online (Sandbox Code Playgroud)

或未命名的功能:

setInterval( function() { console.log("timer!"); }, 1000 );
Run Code Online (Sandbox Code Playgroud)

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

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

一个常见的错误是使用w3schools所示的这两个功能.这使得隐式调用eval.