2010-03-20 13 views
26
function test(){ 
    if(true){ 
     var a = 5; 
    } 
    alert(a); 
} 

test(); 

Continuo ad ottenere errori "fuori campo" nel mio codice JS quando controllo con JsLint che non ha senso per me. Così ho creato rapidamente un esempio. C'è qualcosa di veramente sbagliato in questo pezzo di codice, in quanto la variabile viene alla fine issata in cima alla funzione comunque.JsLint errore 'fuori campo'

+0

quindi è più di un avviso. – Rajat

+2

Molti degli "errori" di JSLint sono in realtà solo avvertimenti nel senso che non sono errori di linguaggio JavaScript e non falliranno necessariamente in fase di runtime. Si chiamano errori perché Douglas Crockford li considera una cattiva pratica. –

risposta

34

Mentre var localizza una variabile per la funzione ed è soggetta a sollevamento, la maggior parte delle lingue ha ambito di blocco e non ambito di funzione.

Utilizzando la parola chiave var all'interno di un blocco if, ma accedendo alla variabile all'esterno di tale blocco, è stato creato un costrutto che può confondere le persone che non hanno familiarità con l'idiosincrasia di JS.

Douglas Crockford recommends utilizzando una singola istruzione var nella parte superiore di una funzione che specifica tutte le variabili che devono essere associate a tale funzione.

function test(){ 
    var a; 
    if(true){ 
     a = 5; 
    } 
    alert(a); 
} 

test(); 

Con più variabili si avrebbe:

function foo() { 
    var a, b, c, d = "only d has an initial value", e; 
    // … 
} 
+14

Douglas Crockford consiglia * molte * cose ... come con qualsiasi strumento dovresti sempre prendere le raccomandazioni di JSLint con un pizzico di sale e personalizzarle a te/alla tua squadra. Se tutti i membri del tuo team comprendono come funziona la scope scope JS, devi assolutamente ignorare le raccomandazioni di Crockford su dove mettere le tue dichiarazioni "var"). – machineghost

5

Il codice che hai scritto sta lavorando. Non è molto leggibile/manutenibile. La dichiarazione della variabileall'interno dello scope di if potrebbe dare la falsa impressione che a sia visibile solo all'interno di questo ambito (che, come mostra questo programma, non è vero - a sarà visibile in tutta l'intera funzione).

Questo avviso JSLint si incoraggia a mettere la dichiarazione presso il campo di applicazione esatto in cui è effettivamente utilizzato la variabile, nel modo seguente:

function test(){ 
    var a; 
    if(true){ 
     a = 5; 
    } 
    alert(a); 
} 
+0

Umm ... 'var = null' ?? – Quentin

+0

Presumibilmente è un errore di battitura e dovrebbe essere "var a = null". – eyelidlessness

+0

Grazie, risolto. –

1

Javascript hanno portata la funzione e non blocca la portata. Quindi, le variabili dichiarate all'interno se la funzione è visibile e accessibile al di fuori del blocco if e all'interno della funzione in cui viene dichiarata l'istruzione if.

I compilatori online come JSLint e jsbin forniscono avvisi ma non sono errori.

Problemi correlati