2009-04-28 13 views
12

Quando si utilizza setTimeout, è necessario inserire il codice che si desidera eseguire in una stringa:setTimeout - come evitare l'uso della stringa per la richiamata?

setTimeout('alert("foobar!");', 1000); 

Tuttavia, voglio eseguire una funzione a cui ho un riferimento in una variabile. Voglio essere in grado di fare questo:

var myGreatFunction = function() { alert("foobar!"); }; 
// ... 
setTimeout('myGreatFunction();', 1000); 

(. Anche se nella vita reale, l'avviso è un po 'più lunghe di codice e myGreatFunction viene passato in giro come parametro ad altre funzioni, entro il quale il setTimeout è chiamato)

Naturalmente, quando il timeout si innesca, myGreatFunction non è una funzione riconosciuta in modo che non viene eseguito.

vorrei javascript mi ​​permetta di fare questo, ma non lo fa:

setTimeout(function() { myGreatFunction(); }, 1000); 

C'è un bel modo intorno a questo?

+4

"Quando si utilizza setTimeout, bisogna mettere il codice che si desidera eseguire in una stringa" Tu certamente non ... in effetti, è _should not_. –

+0

@Tomalak - sì, hai ragione. Vedi il commento sulla risposta di Kirtan ...:/ – teedyay

+0

In realtà l'ho visto; volevo solo essere esplicito qui per il bene di chiunque altro possa vedere la domanda :) –

risposta

28

Se non è necessario chiamare myGreatFunction con argomenti, si dovrebbe essere in grado di passare setTimeout un riferimento alla funzione:

setTimeout(myGreatFunction, 1000); 

Inoltre, si dovrebbe sempre evitare di passare setTimeout codice che si deve valutare (che è ciò che accade quando si avvolge il codice tra virgolette). Al contrario, avvolgere il codice in una funzione anonima:

setTimeout(function() { 
    // Code here... 
}, 1000); 

Vedere la setTimeout page at the Mozilla Development Centre per ulteriori informazioni.

Steve

14

Chi ha detto che non ti permette di farlo?

Lo fa, il codice -

setTimeout(function() { myFunction(); }, 1000); 

è perfettamente valida.

+9

Haha - sì, hai ragione. Un bug non correlato significava che la mia funzione non veniva chiamata quando effettivamente lo era. Questo mi lascia nella posizione un po 'imbarazzante di voler abbassare il voto sulla mia stessa domanda ... – teedyay

Problemi correlati