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
var
hanno 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
var
sono proprietà dell'oggetto globale (globalThis
), ma non possono essere eliminate condelete
. - È consigliabile usare
let
econst
per 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
var
non 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
var
fuori dal corpo di una funzione, si dichiara una variabile globale. Ma le variabili globali dichiarate convar
differiscono dalle globali dichiarate conlet
in un modo importante. Le globali dichiarate convar
sono 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 dichiarazionivar
globali non possono essere eliminate con l'operatoredelete
che si vedrà più avanti. Le variabili globali e le costanti dichiarate conlet
econst
non sono proprietà dell'oggetto globale. - A differenza delle variabili dichiarate con
let
, è legale dichiarare la stessa variabile più volte convar
. E poiché le variabilivar
hanno 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évar
non 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 convar
possono 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 chelet
corregge: se si dichiara una variabile conlet
ma si tenta di usarla prima che l'istruzionelet
venga 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
.