2012-04-18 15 views
10

Sono sicuro di aver letto una discussione su SO su questo ma non riesco a trovarlo. Semplicemente, ci sono contro per dichiarare un incremento del ciclo for all'interno della dichiarazione del ciclo? Qual è la differenza tra questo:Dichiarazione var all'interno di Javascript per la dichiarazione del ciclo

function foo() { 
    for (var i=0; i<7; i++) { 
     // code 
    } 
} 

... e questo:

function foo() { 
    var i; 
    for (i=0; i<7; i++) { 
     // code 
    } 
} 

Dal momento che JS ha portata la funzione, o dovrebbe andare bene, giusto? Ci sono casi limite in cui il primo approccio potrebbe causare problemi?

Se sono identici, perché Crockford/JSLint è tutto, "No way dawg", a riguardo?

+2

Possibile duplicato di [variabili JavaScript che dichiarano loop esterno o interno?] (Http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop) –

risposta

12

Questi sono esattamente gli stessi. Tutte le variabili locali in javascript hanno scope di funzione che significano che sono vivi per l'intera funzione in cui sono dichiarate. Questo è spesso contro-intuitivo in un primo momento poiché la maggior parte delle lingue di parentesi graffa fa il tempo di vita della variabile al blocco in cui sono dichiarate.

Una parte degli sviluppatori di Javascript preferisce molto il secondo modulo. La logica è che dal momento che tutte le variabili hanno scope di funzione, dovresti dichiararle a livello di funzione per rendere esplicita la durata anche per chi non ha familiarità con Javascript. Questo è solo uno stile e anche se non è affatto una regola dura

EDIT

Si noti che con l'introduzione di ES6 let, è ora possibile utilizzare lasciate all'interno del vostro ciclo per un reale blocco con ambito variabile more details

for(let i = 1; i <= 5; i++) { 
    setTimeout(function(){ 
     console.log('Value of i : ' + i); 
    },100); 
} 
+0

C'è anche 'let' che è simile a' var' in quanto fornisce anche un ambito locale, ma differisce dal fatto che riceve scope di blocco. Non è accessibile al di fuori di un 'for' /' if'/'while' ecc. – 4castle

0

Questi sono entrambi esattamente la stessa cosa.

+0

Non è una risposta molto utile; la domanda è, dato che sono funzionalmente equivalenti, perché la regola in JSLint? JSLint è sorprendentemente pignolo per una vasta gamma di cose, la cui importanza per voi può variare ampiamente, ma c'è un metodo per la sua follia. –

+0

JSLint significa niente. – Rob

+1

Lol significa qualcosa ... forse non molto ma per un noob come me aiuta a stabilire buone abitudini. –

7

Il problema con la dichiarazione con var nell'intestazione del loop è che è ingannevole. Si Sembra come si sta dichiarando una variabile il cui ambito di applicazione è limitato al for ciclo, quando in realtà esiste ovunque all'interno della funzione - tra cui prima della dichiarazione:

var i = 1; 
function foo() { 
    console.log(i);      // 'undefined' 
    for (var i=1; i<100; ++i) { 
    } 
} 

anche se la chiamata avviene prima console.log la dichiarazione del locale i, è ancora in ambito perché è all'interno della stessa funzione. Quindi il locale i, a cui non è ancora stato assegnato alcun valore, è ciò che viene passato a log. Questo può essere sorprendente; non è certamente ovvio per chiunque non abbia familiarità con le regole di scoping di Javascript.

A partire da ECMAScript 2015, esiste un modo migliore per dichiarare le variabili: let. Le variabili dichiarate con let sono locali al blocco che le contiene, non all'intera funzione. Quindi questa versione del codice di cui sopra verrà stampata 1 come previsto:

let i=1; // could use var here; no practical difference at outermost scope 
function foo() { 
    console.log(i);    // 1 
    for (let i=1; i<100; ++i) { 
    } 
} 

Quindi le migliori pratiche in Javascript moderna è di dichiarare le variabili con let invece di var. Tuttavia, se si è bloccati con un'implementazione pre-ECMAScript 2015, è un po 'meno confuso dichiarare tutte le variabili nella parte superiore della funzione, piuttosto che attendere il primo utilizzo.

+0

Quindi, fintanto che conosci la gestione di scope di Js, allora va tutto bene. –

+1

ecco perché la gente deve smettere di usare 'var' –

+0

Grazie per il promemoria, @SartherisStormhammer. Aggiornato per affrontare la disponibilità di 'let' nella lingua moderna. –

1

Non c'è alcuna differenza, ma preferiscono il secondo modo (per Crockford) perché mostra esplicitamente che la variabile disponibili all'esterno del ciclo for:

function() { 
    for(var i=0; i<7; i++) { 
     // code 
    } 

    // i is still in scope here and has value 7 
} 
0

Il blocco di codice due sono identici. La prima istruzione del ciclo for viene eseguita prima dell'avvio del ciclo for, il ciclo è in esecuzione mentre la seconda istruzione è vera e la terza istruzione viene eseguita ogni volta che il loop esegue una volta l'iterazione.

Questo significa che

for(var i = 0; i < 8; i++) { 
    //some Code 
} 

è identico a

var i = 0; 
for(;i < 8;) { 
    //some Code 
    i++; 
} 

(Il punto e virgola in seguito alla ( è per dire al computer che i < 8 è in realtà la seconda affermazione, non il primo).

Problemi correlati