【问题标题】:Why does the setInterval callback execute only once?为什么 setInterval 回调只执行一次?
【发布时间】:2012-04-16 22:39:59
【问题描述】:

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

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

window.setInterval(timer(), 1000)

【问题讨论】:

  • 问题是timer() 调用由评估timer 产生的函数对象,然后将结果(undefined) 传递给setTimeout。所以,不要调用它。相反,只需传递函数对象:setInterval(timer, 1000)

标签: javascript callback setinterval


【解决方案1】:

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

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

window.setInterval(timer, 1000);

或者更短(但是当函数变大时可读性也会变差):

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

【讨论】:

  • 答案正确指出回调函数的参数中不应有“()”。
  • 根据developer.mozilla.org/en/Extensions/…的说法,较短的版本可能会导致内存泄漏。
  • @CrendKing 两个版本都有完全相同的“问题”(同样,对于扩展,不影响普通网页/JS),因为重要的是 对象生存期
  • 这就是我说“可以”的原因,因为 OP 没有指定他的用例。如果它是从 Mozilla 扩展中提取的,请注意它。
  • 你不能用 setInterval,但你可以用 setTimeout 函数来模仿。
【解决方案2】:

setIntervalsetTimeout 必须与回调一起使用,例如:

setInterval(timer, 1000);

或未命名的函数:

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

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

当函数作为对象传递时,例如doSomething ( someFunc ) 你正在传递一个回调。这样someFunc 作为引用传递,并在调用函数的某处执行。这和其他语言的函数指针是一样的。

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

【讨论】:

    猜你喜欢
    • 2019-01-16
    • 2021-04-12
    • 2019-08-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多