2008-10-26 13 views
12

Ich versuche, eine setTimeout aus einem setInterval Rückruf zu nennen:Wie Var lösen

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 funktioniert wie erwartet, aber setTimeout Anruf versagt. Ich schätze, das Problem hängt mit der Tatsache zusammen, dass ich auf eine Variable (myVar) verweise, die nicht im Gültigkeitsbereich ist.

Was ist der beste Weg, dies zu lösen?

+0

Verschlüsse verwenden, wie ich unten um das funktionieren würde angegeben, wobei der innere Verschluss hat Zugang zu den äußeren Verschlüsse Umfang. – FlySwat

+0

Ich muss etwas vermissen - versuchen Sie etwas Leistung durch Vorberechnung myVar zu speichern? Warum nicht setTimeout ("document.getElementById (" givenID "). InnerHTML = 'TEST" ", 2000); ? –

+1

Verwenden Sie keine Anführungszeichen mit setTimout/setInterval. Dadurch wird in der JS-Laufzeitumgebung Eval aufgerufen, wodurch der Code in einem neuen Kontext ausgeführt wird. – FlySwat

Antwort

32

Dies ist ein perfekter Kandidat für Verschlüsse:

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

Ihr Problem Umfang verwandt ist, und dies würde das umgehen.

+0

Ich denke, Sie haben Recht - Ich habe die Frage bearbeitet – JohnIdol

+2

So ein guter Grund, keine Strings als Parameter zu setTimeout übergeben und setInterval! :-) –

+0

sicher Andrew - ich habe dich gewählt :-) – JohnIdol

1

Führen Sie es in Firefox und überprüfen Sie Tools | Fehler Konsole. Wenn setTimeout fehlschlägt, kann es Ihnen sagen, warum dort.

Versuchen Sie auch, "someFunction();" durch "alert('hi')" (kein Semikolon) ersetzen und sehen, ob das funktioniert. Wenn dies der Fall ist, wird das Problem erheblich eingeschränkt.

+0

Prost - Ich tat dies und bemerkte, dass das Problem nicht mit SetTimeout - siehe Edit – JohnIdol

4

Als eine Angelegenheit von Best-Practice, versuchen Sie keine Strings als Parameter an setTimeout und setInterval zu verwenden, da die eval aufrufen ... könnte das folgende Formular verwendet auch dieses Problem leichter zu verstehen/debug:

setInterval(function() { 
    // do stuff 
    // ... 
    // now wait 2 secs then call someFunction 
    setTimeout(someFunction, 2000); 
}, 10000); 
+0

großen Vorschlag - danke – JohnIdol

11

Ich hatte ein ähnliches Problem. Das Problem war, dass ich versuchte, eine Methode von sich aus über eine setTimeout() aufzurufen. So etwas wie diese, die für mich nicht funktioniert hat:

function myObject() { 

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

} 

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

Die folgende funktionierten AUCH NICHT:

function myObject() { 

    this.egoist = function() { 
     with (this) { setTimeout(function() { 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); 

Die Lösung mit() Aussage wie zu verwenden, so war

Natürlich ist dies ein endloser Zyklus, aber der Punkt, den ich hier mache, ist anders.

this helps :)

+0

schön, die 'mit' Aussage ist meiner Meinung nach unterbewertet .. – Alex

+0

dies half: D danke –

+2

entdecken "mit (dies) "habe meinen Tag gemacht, danke! – WebChemist