我有一些 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” 更改为指向窗口,因此您将丢失对象引用。