setInterval 似乎不喜欢它调用的函数中的 () 。为什么?

setInterval doesn't seem to like () in the function it invokes. Why?

当我执行以下命令时,incidentController10 秒后被调用并且每隔 10 秒继续执行没有问题:

// This works fine in nodejs v0.11.13
setInterval(incidentController, 10 * 1000);

function incidentController () {
 console.log ('executed'); 
}

但是,这 立即执行 并在第二次迭代时抛出以下错误:

//This doesn't. The parens which wrap (123) cause the error.

setInterval(incidentController(123), 10 * 1000);

function incidentController (someInt) {
 console.log ('executed: ', someInt); 
}

错误:

timers.js:287
    callback.apply(this, args);
            ^
TypeError: Cannot read property 'apply' of undefined
    at wrapper [as _onTimeout] (timers.js:287:13)
    at Timer.listOnTimeout (timers.js:133:15)

好像incidentControlleris/becomesundefined不知何故。有人可以解释为什么这是预期的行为(无论如何我认为是)?

我可以很容易地解决这个问题,但我只是很好奇为什么它会这样——使得传递参数值不太方便,因为我不能在 setInterval 语句中这样做本身。

setInterval 接受一个函数对象作为第一个参数。但是,当你这样做时

setInterval(incidentController(123), 10 * 1000);

您正在传递调用 incidentController 的结果,即 undefined(在 JavaScript 中,如果函数没有 return 任何明确的内容,则默认情况下, undefined 将被 returned)。这就是您收到错误

的原因
Cannot read property 'apply' of undefined

它正在尝试调用 undefined 上的 apply 函数。


makes passing in parameter values a bit less convenient since I can't do it inside the setInterval statement itself

不,先生。可以方便的在setInterval本身给回调函数传参,像这样

setInterval(incidentController, 10 * 1000, 123);

现在,当调用 incidentController 时,每隔 10 秒,123 将作为第一个参数传递给它。

使用setInterval like

是不正确的
setInterval(incidentController(123), 10 * 1000);

因为它需要一个函数作为第一个参数(而不是一个带有结果的执行函数)。

如果您希望将参数传递给回调,您应该使用匿名函数包装函数调用,例如

setInterval(function(){incidentController(123)}, 10 * 1000);

Pass parameters in setInterval function