setInterval 在它调用的函数中似乎不喜欢 () 。为啥? [复制]

Posted

技术标签:

【中文标题】setInterval 在它调用的函数中似乎不喜欢 () 。为啥? [复制]【英文标题】:setInterval doesn't seem to like () in the function it invokes. Why? [duplicate]setInterval 在它调用的函数中似乎不喜欢 () 。为什么? [复制] 【发布时间】:2015-05-24 03:09:08 【问题描述】:

当我执行以下操作时,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 语句本身中这样做,所以传递参数值不太方便。

【问题讨论】:

因为你正在执行函数! :) 它不知道您要为其分配引用。 Pass parameters in setInterval function / How can I pass a parameter to a setTimeout() callback? 【参考方案1】:

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(incidentController, 10 * 1000, 123);。有记录吗? @maboiteaspam 是的,它记录在 MDN docs 和 Node.js docs 哇,我也不知道,这很酷。我猜这是最近的功能?底部显示 IE10+ 支持回调参数。 @AlfonsoGarnett 大多数浏览器还不支持。但是 OP 已经标记了 node.js。所以,这对他来说效果很好:-)【参考方案2】:

setIntervallike 使用是不正确的

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

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

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

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

见Pass parameters in setInterval function

【讨论】:

以上是关于setInterval 在它调用的函数中似乎不喜欢 () 。为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

setinterval读法

js基本知识5

使用setInterval设置多少秒重新发送验证码

使用setInterval设置多少秒重新发送验证码

在javascript中 setInterval()clearInterval()clearTimeout()等等常用的函数的含义

使用 SetInterval() 调用 Javascript 对象方法