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

Rus*_*her 3 javascript setinterval node.js

当我执行以下操作时,incidentController10秒后调用并继续执行,每秒都没有问题10:

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

function incidentController () {
 console.log ('executed'); 
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

function incidentController (someInt) {
 console.log ('executed: ', someInt); 
}
Run Code Online (Sandbox Code Playgroud)

错误:

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)
Run Code Online (Sandbox Code Playgroud)

似乎incidentController是/变得undefined某种程度.有人可以解释为什么这是预期的行为(我认为它是,无论如何)?

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

the*_*eye 8

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

setInterval(incidentController(123), 10 * 1000);
Run Code Online (Sandbox Code Playgroud)

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

Cannot read property 'apply' of undefined
Run Code Online (Sandbox Code Playgroud)

它试图调用该apply函数undefined.


使得传递参数值不太方便,因为我无法在setInterval语句本身内完成

不,先生.你可以方便地将参数传递给回调函数setInterval,就像这样

setInterval(incidentController, 10 * 1000, 123);
Run Code Online (Sandbox Code Playgroud)

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

  • @maboiteaspam是的,它记录在[MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval#Syntax),以及[Node.js docs]中( https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_arg) (2认同)