12

我正在尝试从 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)有关。

解决这个问题的最佳方法是什么?

4

4 回答 4

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);

您的问题与范围相关,这可以解决这个问题。

于 2008-10-26T02:13:39.183 回答
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();

当然,这是一个无限循环,但我在这里要表达的观点不同。

希望这可以帮助 :)

于 2011-07-30T15:40:42.433 回答
4

作为最佳实践,尽量不要使用字符串作为参数setTimeoutsetInterval因为这会调用eval......使用以下形式也可能使这个问题更容易理解/调试:

setInterval(function () {
    // do stuff
    // ...
    // now wait 2 secs then call someFunction
    setTimeout(someFunction, 2000);
}, 10000);
于 2008-10-26T02:13:37.217 回答
1

在 Firefox 中运行它并检查工具 | 错误控制台。如果 setTimeout 失败,它可能会告诉你为什么。

另外,尝试用"someFunction();""alert('hi')"无分号)替换,看看是否有效。如果是这样,问题就会大大缩小。

于 2008-10-26T01:57:59.463 回答