E 'soprattutto una questione di stile.
Poiché le dichiarazioni var
sono automaticamente hoisted up nella parte superiore dell'ambito, è opportuno collocarle al di sopra del loro ambito in modo da poter leggere il codice più vicino a come l'interprete lo eseguirà.
La dichiarazione delle variabili nella parte superiore del loro ambito è Crockford's recommendation. E ha senso perché chiarisce alcuni fraintendimenti comuni.
Ad esempio:
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
Da var
ha portata funzione, tutte le iterazioni (e funzioni all'interno di essi) si riferiscono alla stessa i
. Poiché tutte e tre le funzioni temporizzate verranno eseguite al termine del ciclo, lo snippet sopra registra tre volte 3
.
Ora per quelli con esperienza di scoping a blocchi, il comportamento di cui sopra non è molto chiaro. Riscrivere il frammento:
var i;
for (i = 0; i < 3; i++) {
// ...
}
Ora, i
viene dichiarata nello scope globale, esattamente come il frammento di precedente. Tuttavia, questo è molto più chiaro su questo.
altro errore:
(function() {
if (true) {
var foo = 1;
} else {
var foo = 1;
}
}());
Ancora, nel blocco con ambito languages¹ quanto sopra è perfettamente valido. Tuttavia, come var
dichiarazioni vengono tirati all'inizio della portata funzione corrente in fase di analisi, quanto sopra è equivalente a:
(function() {
var foo;
var foo;
if (true) {
foo = 1;
} else {
foo = 1;
}
}());
La variabile viene dichiarata due volte. La maggior parte dei browser ignorerà la seconda dichiarazione e il codice "funzionerà", ma gli strumenti di analisi del codice statico come JSHint ti urleranno.
È possibile riscrivere con una sola dichiarazione ed è perfettamente valido:
(function() {
if (true) {
var foo = 1;
} else {
foo = 1;
}
}());
Ma codificatori OCD-like come me lo troverete piuttosto brutto. Quindi, ancora una volta, dichiarando in cima allo scopo:
Sembra molto più ordinato.
Ancora una volta, è principalmente una questione di stile. Personalmente, se ho una funzione gigante, odio scorrere fino in fondo solo per verificare se una variabile è già stata dichiarata e aggiungerla alla lista.In tal caso, potrei semplicemente aggiungere un paio di dichiarazioni var
nel mezzo della funzione (contro la raccomandazione di Crockford) che personalmente trovo più facile da leggere e mantenere.
Poiché è una questione di stile, assicurati di mantenere il tuo codice il più gestibile e conciso possibile.
In altra faccia della medaglia, devo ammettere che, personalmente, ho iniziato e per lo più usato var
dichiarazioni quando la variabile viene utilizzata in primo luogo. Questo è un aspetto della lingua e puoi usarlo in questo modo senza problemi.
Ma devo anche ammettere che, se avessi seguito le raccomandazioni di Crockford dall'inizio, avrei avuto molti mal di testa (come con le idee sbagliate mostrate sopra) e avrei afferrato l'aspetto dell'ambito delle funzioni di JavaScript molto più velocemente.
¹ noti che JS 1,7 variabili di blocco con ambito introdotti attraverso let
, ma non è ancora ampiamente supportato.
Per lo più solo una questione di stile. Crockford raccomanda di dichiarare tutte le variabili nella parte superiore dell'ambito e, a volte, aiuta a chiarire alcuni fraintendimenti comuni (ad esempio la dichiarazione di 'var' all'interno di' for' loop che in realtà appartiene all'ambito esterno di 'for'). –
@ FabrícioMatté Grazie! Non avevo nemmeno pensato a "for' loops", ma ha senso. – Hendrik