我正在尝试从setInterval回调中调用setTimeout:
function callback()
{
//assign myVar
var myVar = document.getElementById("givenID");
//...
//now wait 2 secs then call some code that uses myVAr
setTimeout("myVar.innerHTML = 'TEST'", 2000);
}
setInterval("callback();", 10000);
setInterval按预期工作,但setTimeout调用失败。我猜这个问题与我引用一个不在范围内的变量(myVar)有关。
解决这个问题的最佳方法是什么?
答案 0 :(得分:32)
这是闭包的理想选择:
setInterval(
function ()
{
var myVar = document.getElementById("givenID");
setTimeout(
function()
{
// myVar is available because the inner closure
// gets the outer closures scope
myVar.innerHTML = "Junk";
},2000);
}, 10000);
你的问题与范围有关,这可以解决这个问题。
答案 1 :(得分:11)
我有类似的问题。问题是我试图通过setTimeout()从内部调用一个方法。这样的事情,对我来说不起作用:
function myObject() {
this.egoist = function() {
setTimeout( 'this.egoist()', 200 );
}
}
myObject001 = new myObject();
myObject001.egoist();
以下也不行:
... setTimeout( egoist, 200 );
... setTimeout( egoist(), 200 );
... setTimeout( this.egoist, 200 );
... setTimeout( this.egoist(), 200 );
... setTimeout( function() { this.egoist() }, 200 );
解决方案是使用with()语句,如下所示:
function myObject() {
this.egoist = function() {
with (this) { setTimeout( function() { egoist() }, 200 );}
}
}
myObject001 = new myObject();
myObject001.egoist();
当然,这是一个无休止的循环,但我在这里提出的观点是不同的。
希望这会有所帮助:)
答案 2 :(得分:4)
作为最佳做法,请尽量不要将字符串用作setTimeout
和setInterval
的参数,因为这会调用eval
...使用以下表单也可能会使问题更容易理解/调试:
setInterval(function () {
// do stuff
// ...
// now wait 2 secs then call someFunction
setTimeout(someFunction, 2000);
}, 10000);
答案 3 :(得分:1)
在Firefox中运行它并检查工具|错误控制台。如果setTimeout失败,它可能会告诉你原因。
另外,尝试将"someFunction();"
替换为"alert('hi')"
(不使用分号),看看是否有效。如果是这样,问题就会明显缩小。