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.
fonte
2012-04-18 00:19:19
Possibile duplicato di [variabili JavaScript che dichiarano loop esterno o interno?] (Http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop) –