我怎样才能传递参数给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”更改为指向窗口,因此您将失去对象引用。

链接地址: http://www.djcxy.com/p/95297.html

上一篇: How can I pass a parameter to a setTimeout() callback?

下一篇: Build an HTML5 game