Nel mondo dello sviluppo frontend, conoscere var let const JavaScript è fondamentale per scrivere codice sicuro, chiaro e conforme agli standard del 2025. Fino a qualche anno fa, var
era la dichiarazione più utilizzata, ma oggi let
e const
ne hanno rivoluzionato l’uso. In questa guida approfondiremo le differenze tra le tre parole chiave, con consigli pratici, best practice ed esempi di codice.
Var Let Const JavaScript: perché è importante nel 2025
Nel 2025, lo sviluppo JavaScript è segnato da continui aggiornamenti (basti pensare a ES2025) e da un crescente numero di librerie e framework. La corretta gestione delle variabili con var let const JavaScript è cruciale per:
- Evitare bug dovuti a scope e shadowing.
- Rendere il codice più leggibile e manutenibile.
- Prevenire conflitti di nome e problemi di hoisting.
- Avere un approccio più sicuro e coerente con le best practice moderne.
Scegliere la dichiarazione giusta tra var
, let
e const
può sembrare un dettaglio, ma è uno dei pilastri fondamentali per garantire qualità al progetto.
Storia di var
: scope function, hoisting, problemi principali
Prima di ES6, la maggior parte del codice JavaScript usava var
. Le sue caratteristiche:
- Function Scope
Una variabile dichiarata convar
è visibile all’interno della funzione in cui è stata definita. In blocchi comeif
ofor
, la variabile rimane accessibile anche all’esterno di quei blocchi. - Hoisting
Convar
, la dichiarazione viene “spostata” in cima allo scope (function o globale). Questo può portare a confusioni: puoi usare la variabile prima che sia stata effettivamente dichiarata, ottenendoundefined
senza errori. - Collisioni e shadowing
Lo scope a livello di funzione (e non di blocco) rende possibile sovrascrivere la stessa variabile accidentalmente.
Problemi principali di var
:
- Manutenibilità ridotta: in file lunghi diventa complicato rintracciare dove sia stata modificata la variabile.
- Shadowing involontario: esistono maggiori possibilità di dichiarare una variabile con lo stesso nome causando sovrapposizioni.
- Hoisting confuso: il codice risulta meno esplicito e più difficile da leggere.
Introduzione a let
e const
: scope block, mutabilità e sicurezza
Con l’avvento di ES6, let
e const
hanno risolto molti dei problemi legati a var
.
- Block Scope
Sialet
checonst
rispettano lo scope di blocco. Se dichiari una variabile in unif
o in unfor
, rimane disponibile solo all’interno di quelle parentesi graffe. - Temporal Dead Zone
Sebbene anchelet
econst
siano soggetti a hoisting, se provi a usarli prima della loro dichiarazione ottieni un ReferenceError. Questa finestra si chiama Temporal Dead Zone. - Mutabilità
let
consente la riassegnazione.const
impedisce la riassegnazione, proteggendo il riferimento.
- Sicurezza
- Meno probabilità di bug grazie al block scope.
const
rende immediatamente chiara l’intenzione di non cambiare un valore.
Tabella comparativa
Caratteristica | var | let | const |
---|---|---|---|
Scope | Function scope | Block scope | Block scope |
Riassegnazione | Consentita | Consentita | Non consentita |
Riderichiarazione | Consentita nello stesso scope | Non consentita nello stesso scope | Non consentita nello stesso scope |
Hoisting | Sì (accessibile come undefined ) | Sì (ma con ReferenceError prima della dichiarazione) | Sì (ma con ReferenceError prima della dichiarazione) |
Uso principale | Compatibilità con vecchio codice | Variabili riassegnabili (cicli, contatori) | Variabili costanti di riferimento |
Quando usare const
, quando preferire let
e quando evitare var
const
- Usalo di default se la variabile non cambia.
- Ottimo per riferimenti a oggetti e array che non vuoi riassegnare.
let
- Usalo se sai che il valore cambierà nel corso del blocco (es. contatori nei
for
, flag booleani, ecc.).
- Usalo se sai che il valore cambierà nel corso del blocco (es. contatori nei
- Perché evitare
var
- Lo scope a livello di funzione può causare conflitti in codice complesso.
- L’hoisting può generare comportamenti imprevedibili.
- Nel 2025, i browser moderni supportano appieno
let
econst
.
Errori comuni e best practice
- Errore #1: Usare
var
dentro blocchi e stupirsi che la variabile sia visibile fuori.
Soluzione: optare perlet
se serve una variabile valida solo in un blocco. - Errore #2: Utilizzare
let
oconst
prima della dichiarazione.
Soluzione: dichiarare sempre le variabili in cima allo scope, evitando la Temporal Dead Zone. - Errore #3: Dichiarare una variabile con
const
ma poi cercare di modificarne il valore.
Soluzione: assicurarsi che la variabile sia realmente costante; in caso di dubbi, meglio usarelet
. - Errore #4: Pensare che un oggetto
const
non sia mutabile internamente.
Soluzione: se l’oggetto deve rimanere completamente immutabile, usare tecniche apposite (ad es.Object.freeze()
).
Esempi di codice pratici
// Esempio di scope con var
function testVar() {
var x = 10;
if (true) {
var x = 20; // stai sovrascrivendo la stessa variabile
console.log("Dentro if, x =", x); // 20
}
console.log("Fuori if, x =", x); // 20
}
testVar();
// Esempio di scope con let
function testLet() {
let y = 10;
if (true) {
let y = 20; // nuova variabile, stesso nome ma scope di blocco
console.log("Dentro if, y =", y); // 20
}
console.log("Fuori if, y =", y); // 10
}
testLet();
// Esempio con const
const PI = 3.14;
PI = 3.14159; // Errore: non puoi riassegnare la costante
// Oggetto con const
const persona = { nome: "Mario", età: 30 };
persona.età = 31; // OK, l'oggetto è mutabile
persona = { nome: "Luigi", età: 25 }; // Errore: riferimento costante
Risorse esterne e interne per approfondire
- Risorse esterne:
- Link interni (CyberAlchimista):
Conclusioni e checklist mentale
Utilizzare in modo appropriato var let const JavaScript ti permette di ridurre i bug, aumentare la sicurezza e scrivere codice più manutenibile. In sintesi:
const
per valori che non cambiano.let
se devi riassegnare la variabile.var
da evitare: scope e hoisting possono creare confusione.
Checklist finale
- Dichiarare le variabili in cima al blocco o allo scope.
- Usare
const
di default. - Passare a
let
se il valore dovrà variare. - Evitare
var
, a meno di specifiche necessità legacy.