协慌网

登录 贡献 社区

如何将参数传递给 setTimeout()回调?

我有一些 JavaScript 代码,如下所示:

function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    var topicId = xmlhttp.responseText;
    setTimeout("postinsql(topicId)",4000);
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}

我得到一个错误,没有定义topicId我使用setTimeout()函数之前一切正常。

我希望在一段时间后调用postinsql(topicId)函数。我该怎么办?

答案

setTimeout(function() {
    postinsql(topicId);
}, 4000)

您需要将匿名函数作为参数而不是字符串提供,后一种方法甚至不应该按照 ECMAScript 规范工作,但浏览器只是宽松的。这是正确的解决方案,在使用setTimeout()setInterval()时,不要依赖于将字符串作为 '函数' 传递,它的速度较慢,因为它必须进行评估而且不正确。

更新:

正如 Hobblin 在对该问题的评论中所说,现在你可以使用Function.prototype.bind()将参数传递给 setTimeout 中的Function.prototype.bind()

例:

setTimeout(postinsql.bind(null, topicId), 4000);

在现代浏览器中,“setTimeout” 接收第三个参数,该参数作为参数发送到计时器末尾的内部函数。

例:

var hello = "Hello World";
setTimeout(alert, 1000, hello);

更多细节:

在做了一些研究和测试之后,唯一正确的实现是:

setTimeout(yourFunctionReference, 4000, param1, param2, paramN);

setTimeout 会将所有额外参数传递给您的函数,以便在那里处理它们。

匿名函数可以用于非常基本的东西,但是在你必须使用 “this” 的对象的实例中,没有办法让它工作。任何匿名函数都会将 “this” 更改为指向窗口,因此您将丢失对象引用。