Come risolvere Var al di fuori dell'ambito nell'ambito della chiamata setTimeout

StackOverflow https://stackoverflow.com/questions/237350

  •  04-07-2019
  •  | 
  •  

Domanda

Sto provando a chiamare un setTimeout da un callback setInterval:

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 funziona come previsto ma la chiamata setTimeout non riesce. Immagino che il problema sia legato al fatto che sto facendo riferimento a una variabile (myVar) che non rientra nell'ambito.

Qual è il modo migliore per risolverlo?

È stato utile?

Soluzione

Questo è un candidato perfetto per chiusure:

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

Il tuo problema è legato all'ambito e questo potrebbe aggirare il problema.

Altri suggerimenti

Ho avuto un problema simile. Il problema era che stavo provando a chiamare un metodo dall'interno attraverso un setTimeout (). Qualcosa del genere, CHE NON FUNZIONA PER ME:

function myObject() {

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

}

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

Il seguente ANCHE NON FUNZIONA:

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

La soluzione era usare con l'istruzione () in questo modo:

function myObject() {

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

}

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

Naturalmente, questo è un ciclo infinito, ma il punto che sto sottolineando qui è diverso.

Spero che questo aiuti :)

Come buona pratica, prova a non usare le stringhe come parametri per setTimeout e setInterval perché invocherà eval .. L'uso del seguente modulo potrebbe anche rendere più facile la comprensione / il debug di questo problema:

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

Eseguilo in Firefox e seleziona Strumenti | Console errori. se setTimeout fallisce, potrebbe dirti perché lì.

Prova anche a sostituire " someFunction (); " con " alert ('hi') " (senza punto e virgola) e vedi se funziona. In tal caso, il problema viene notevolmente ridotto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top