一尘不染

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

javascript

我有一些如下的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)一段时间后调用我的函数。我该怎么办?


阅读 376

收藏
2020-04-25

共1个答案

一尘不染

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

您需要将匿名函数作为参数而不是字符串作为参数,后一种方法甚至不符合ECMAScript规范,但浏览器比较宽松。这是正确的解决方案,在使用setTimeout()或时setInterval(),永远不要依赖于将字符串作为“函数”进行传递,因为它必须进行求值并且不正确,所以速度较慢。

更新:

正如Hobblin在对问题所说的那样,现在您可以使用将参数传递给setTimeout内部的函数Function.prototype.bind()

例:

setTimeout(postinsql.bind(null, topicId), 4000);
2020-04-25