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

时间:2015-05-24 03:09:09

标签: javascript node.js setinterval

当我执行以下操作时,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)

似乎incidentController以某种方式成为undefined。有人可以解释为什么这是预期的行为(我认为它是,无论如何)?

我可以非常轻松地解决这个问题,但我只是好奇它为什么会这样做 - 因为我无法在{{1}内执行此操作,所以传递参数值不太方便声明本身。

2 个答案:

答案 0 :(得分:8)

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

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

您正在传递调用incidentController的结果,即undefined(在JavaScript中,如果函数未显式返回任何内容,则默认情况下将返回undefined) 。这就是你得到错误的原因

Cannot read property 'apply' of undefined

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

  

使得传递参数值不太方便,因为我无法在setInterval语句本身内执行此操作

不,先生。您可以方便地将参数传递给setInterval本身的回调函数,就像这个

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

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

答案 1 :(得分:1)

使用setInterval之类的

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

因为它希望函数作为第一个参数(不是带结果的已执行函数)。

如果您希望将参数传递给回调函数,则应使用匿名函数(如

)包装函数调用
setInterval(function(){incidentController(123)}, 10 * 1000);

请参阅Pass parameters in setInterval function