Dichiarare Variabili con var in Javascript
- Nelle versioni precedenti a ES6 di JavaScript, le variabili erano dichiarate con
var, che non ha scope di blocco e può essere ridichiarata. - Le variabili dichiarate con
varhanno scope di funzione e possono essere usate ovunque all'interno della funzione, anche prima della loro dichiarazione, grazie al hoisting. - Le variabili globali dichiarate con
varsono proprietà dell'oggetto globale (globalThis), ma non possono essere eliminate condelete. - È consigliabile usare
leteconstper dichiarare variabili e costanti, poiché offrono uno scope di blocco e prevengono errori comuni associati avar.
Dichiarazioni di Variabili con var
Nelle versioni di JavaScript precedenti a ES6, l'unico modo per dichiarare una variabile era con la parola chiave var, e non c'era modo di dichiarare costanti. La sintassi di var è proprio come la sintassi di let:
var x;
var dati = [], conteggio = dati.length;
for(var i = 0; i < conteggio; i++) console.log(dati[i]);
Anche se var e let hanno la stessa sintassi, ci sono importanti differenze nel modo in cui funzionano:
- Le variabili dichiarate con
varnon hanno scope di blocco. Invece, hanno scope del corpo della funzione contenitore, non importa quanto profondamente annidate siano all'interno di quella funzione. - Se si usa
varfuori dal corpo di una funzione, si dichiara una variabile globale. Ma le variabili globali dichiarate convardifferiscono dalle globali dichiarate conletin un modo importante. Le globali dichiarate convarsono implementate come proprietà dell'oggetto globale. L'oggetto globale può essere referenziato comeglobalThis. Quindi se si scrivevar x = 2;fuori da una funzione, è come se si fosse scrittoglobalThis.x = 2;. Si noti tuttavia che l'analogia non è perfetta: le proprietà create con dichiarazionivarglobali non possono essere eliminate con l'operatoredeleteche si vedrà più avanti. Le variabili globali e le costanti dichiarate conleteconstnon sono proprietà dell'oggetto globale. - A differenza delle variabili dichiarate con
let, è legale dichiarare la stessa variabile più volte convar. E poiché le variabilivarhanno scope di funzione invece di scope di blocco, è effettivamente comune fare questo tipo di ridichiarazione. La variabileiè frequentemente usata per valori interi, e specialmente come variabile indice dei ciclifor. In una funzione con più ciclifor, è tipico che ognuno inizi confor(var i = 0; .... Poichévarnon delimita queste variabili al corpo del ciclo, ognuno di questi cicli sta (innocuamente) ri-dichiarando e re-inizializzando la stessa variabile. - Una delle caratteristiche più inusuali delle dichiarazioni
varè conosciuta come hoisting. Quando una variabile è dichiarata convar, la dichiarazione viene sollevata (o "issata") alla cima della funzione contenitore. L'inizializzazione della variabile rimane dove è stata scritta, ma la definizione della variabile si sposta alla cima della funzione. Quindi le variabili dichiarate convarpossono essere usate, senza errore, ovunque nella funzione contenitore. Se il codice di inizializzazione non è ancora stato eseguito, allora il valore della variabile potrebbe essereundefined, ma non si otterrà un errore se si usa la variabile prima che sia inizializzata. (Questo può essere una fonte di bug ed è una delle importanti caratteristiche problematiche cheletcorregge: se si dichiara una variabile conletma si tenta di usarla prima che l'istruzioneletvenga eseguita, si otterrà un errore effettivo invece di vedere solo un valoreundefined.)
Utilizzo di Variabili Non Dichiarate
In modalità strict (che si studierà più avanti), se si tenta di utilizzare una variabile non dichiarata, si otterrà un errore di riferimento quando si esegue il codice. Al di fuori della modalità strict, tuttavia, se si assegna un valore a un nome che non è stato dichiarato con let, const, o var, si finirà per creare una nuova variabile globale. Sarà una globale indipendentemente da quanto profondamente annidate all'interno di funzioni e blocchi sia il codice, il che quasi certamente non è quello che si vuole, è soggetto a errori, ed è una delle migliori ragioni per utilizzare la modalità strict!
Le variabili globali create in questo modo accidentale sono come le variabili globali dichiarate con var: definiscono proprietà dell'oggetto globale. Ma a differenza delle proprietà definite dalle dichiarazioni var appropriate, queste proprietà possono essere eliminate con l'operatore delete.