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

3
当我执行以下代码时,incidentController会在10秒后被调用,并且每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。有人能解释为什么这是预期行为吗(我认为它是预期的)?
我可以很容易地解决这个问题,但我只是好奇为什么它会表现出这种行为--这使得传递参数值有点不方便,因为我不能在 setInterval 语句内部执行此操作。

1
因为你正在执行这个函数! :) 它不知道你想要给它分配一个引用。 - epascarello
1
将参数传递给 setInterval 函数:在 setInterval 函数中传递参数如何向 setTimeout() 回调函数传递参数?如何向 setTimeout() 回调函数传递参数? - Jonathan Lonowski
2个回答

7

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

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

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

Cannot read property 'apply' of undefined

它正在尝试在未定义的对象上调用 apply 函数。


这使得传递参数值有点不方便,因为我不能在setInterval语句本身内部执行它

不,先生。您可以在setInterval本身中向回调函数方便地传递参数,就像这样:

setInterval(incidentController, 10 * 1000, 123);

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

1
不知道 setInterval(incidentController, 10 * 1000, 123) 这个语法。它有文档记录吗? - user4466350
2
@maboiteaspam 是的,在MDN文档Node.js文档中都有记录。 - thefourtheye
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user4698813
1
@AlfonsoGarnett 大多数浏览器目前还不支持。但是 OP 已经标记了 node.js。所以,对他来说这将非常有效 :-) - thefourtheye

1

使用 setInterval 的方式是不正确的

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

因为它期望第一个参数是一个函数(而不是带有结果的执行函数)。
如果您希望将参数传递给回调函数,您应该使用匿名函数包装函数调用,例如:
setInterval(function(){incidentController(123)}, 10 * 1000);

查看 如何在setInterval函数中传递参数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接