2008-10-26 47 views
12

我试图从setInterval的回调中调用的setTimeout内解决变量超出范围:如何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

使用像我下面指出的闭包可以解决这个问题,内部闭包可以访问外部闭包范围。 – FlySwat 2008-10-26 02:37:52

+0

我必须错过一些东西 - 你是否试图通过预先计算myVar来节省一些性能?为什么不是 setTimeout(“document.getElementById(”givenID“)。innerHTML ='TEST'”,2000); ? – 2008-10-26 02:46:55

+1

不要在setTimout/setInterval中使用引号,它会强制JS运行时调用Eval,Eval会在新的上下文中运行代码,因此是范围问题。 – FlySwat 2008-10-26 02:48:16

回答

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

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

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

4

作为最佳实践的问题,尽量不要使用字符串作为参数传递给setTimeoutsetInterval,因为这将调用eval ...使用下面的表格也可能使这个问题更容易理解/调试:

setInterval(function() { 
    // do stuff 
    // ... 
    // now wait 2 secs then call someFunction 
    setTimeout(someFunction, 2000); 
}, 10000); 
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); 

的解决办法是用()语句中使用像这样:

function myObject() { 

    this.egoist = function() { 
     with (this) { setTimeout(function() { egoist() }, 200);} 
    } 

} 

myObject001 = new myObject(); 
myObject001.egoist(); 

当然,这是一个无止境的循环,但我在这里提出的观点是不同的。

希望这会有所帮助:)