2008-10-26 27 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(); 

當然,這是一個無止境的循環,但我在這裏提出的觀點是不同的。

希望這會有所幫助:)