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

我有一些JavaScript代码,看起来像这样:

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

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

我收到一个错误,该错误未定义在我使用该函数之前一切都在工作。topicIdsetTimeout()

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


答案 1
setTimeout(function() {
    postinsql(topicId);
}, 4000)

您需要将匿名函数作为参数而不是字符串提供,后一种方法甚至不应该根据 ECMAScript 规范工作,但浏览器只是宽松。这是正确的解决方案,在使用时不要依赖将字符串作为“函数”传递,或者,它更慢,因为它必须被评估并且它是不正确的。setTimeout()setInterval()

更新:

正如Hobblin在他对这个问题的评论中所说的那样,现在你可以使用Function.prototype.bind()将参数传递给setTimeout内部的函数。

例:

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

答案 2

在现代浏览器(即IE11及更高版本)中,“setTimeout”接收第三个参数,该参数作为参数发送到计时器末尾的内部函数。

例:

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

更多详情: