Dichiarare Variabili con var in Javascript

Concetti Chiave
  • 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 con delete.
  • È consigliabile usare let e const per dichiarare variabili e costanti, poiché offrono uno scope di blocco e prevengono errori comuni associati a var.

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 con var differiscono dalle globali dichiarate con let in un modo importante. Le globali dichiarate con var sono implementate come proprietà dell'oggetto globale. L'oggetto globale può essere referenziato come globalThis. Quindi se si scrive var x = 2; fuori da una funzione, è come se si fosse scritto globalThis.x = 2;. Si noti tuttavia che l'analogia non è perfetta: le proprietà create con dichiarazioni var globali non possono essere eliminate con l'operatore delete che si vedrà più avanti. Le variabili globali e le costanti dichiarate con let e const non sono proprietà dell'oggetto globale.
  • A differenza delle variabili dichiarate con let, è legale dichiarare la stessa variabile più volte con var. E poiché le variabili var hanno scope di funzione invece di scope di blocco, è effettivamente comune fare questo tipo di ridichiarazione. La variabile i è frequentemente usata per valori interi, e specialmente come variabile indice dei cicli for. In una funzione con più cicli for, è tipico che ognuno inizi con for(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 con var, 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 con var possono essere usate, senza errore, ovunque nella funzione contenitore. Se il codice di inizializzazione non è ancora stato eseguito, allora il valore della variabile potrebbe essere undefined, 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 che let corregge: se si dichiara una variabile con let ma si tenta di usarla prima che l'istruzione let venga eseguita, si otterrà un errore effettivo invece di vedere solo un valore undefined.)

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.