繁体   English   中英

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

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

当我执行以下命令时, 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语句内部进行操作。

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

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

您传递调用的结果incidentController ,这是undefined (在JavaScript中,如果一个函数没有明确返回任何东西,则默认情况下, undefined将被退回)。 这就是为什么您得到错误

Cannot read property 'apply' of undefined

它试图在undefined上调用apply函数。


使得传递参数值不太方便,因为我无法在setInterval语句内部进行传递

不,先生。 您可以方便地将参数传递给setInterval本身中的回调函数,如下所示

setInterval(incidentController, 10 * 1000, 123);

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

像这样使用setInterval是不正确的

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

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

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

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

请参见setInterval函数中的传递参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM