2012-11-10 9 views
5

Non capisco cosa sia sbagliato. Ho tre codici:
Prime:setInterval all'interno di una funzione genera un errore: la variabile non è definita

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
</script> 



Secondo:

<script language="JavaScript" type="text/javascript"> 
    function countdown() 
    { 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



Terzo:

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    function countdown() 
    { 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



Il primo codice funziona bene, la seconda produce un errore nella riga "setInterval": "count non è definito" e il terzo codice funziona di nuovo bene. L'ambito della variabile "count" dovrebbe essere globale per la funzione setInterval nel secondo codice. Perché non lo è? Sto usando Mozilla Firefox. Grazie.

+0

Hai appena trovato uno dei motivi per cui non dovresti usare le stringhe come callback per setInterval/setTimeout. Dai un'occhiata alle domande correlate a destra, scommetto che metà di loro condividono lo stesso problema. – Yoshi

risposta

8

Per un gran numero di ragioni, una delle quali si appena incontrato, mai mai Passa una stringa di setTimeout o setInterval. Mai. Voglio dire che. Non c'è mai una buona ragione.

Passare invece una funzione. La capacità di passare oggetti funzionali attorno è una delle migliori caratteristiche di JS.

var count = 0; 
alert(count); 

var timer = setInterval(function(){ 
    count = count + 1; 
    alert(count); 
}, 10000); 

Il problema che si sta affrontando è che il codice come una stringa in questo modo non rispetterà l'ambito. Verrà eseguito nell'ambito globale, che è un luogo in cui la variabile non esiste nel 2 ° e nel 3 ° snippet. E il primo frammento funziona perché count è davvero una variabile globale.

Altri problemi con questo derivano dal fatto che questo è fondamentalmente eval che viene fornito con i suoi mal di testa ed è meglio evitare del tutto. Eval is Evil dopo tutto.

+0

Ciao, Alex Wayne! Grazie per l'aiuto. Non capisco ancora perché la stringa è così male, ma proverò seguendo il link che hai fornito. Strano che il problema non sia coperto dai libri che ho letto. – GreenBear

+0

In breve, è brutto perché è lento e potenzialmente pericoloso (come eval è) e si comporta in modi che non ti aspetti. Tutte queste cose vengono risolte utilizzando una funzione reale reale. –

Problemi correlati