![]() |
Quando si lavora con JavaScript moderno, soprattutto con le dichiarazioni let e const, ci si può imbattere in un concetto chiamato Temporal Dead Zone (TDZ). È un concetto chiave per comprendere il comportamento delle variabili e per evitare errori difficili da individuare.
In questo articolo spiegheremo cos'è la Temporal Dead Zone, perché esiste e come evitare problemi legati ad essa.
Cos'è la Temporal Dead Zone?
La Temporal Dead Zone è l'intervallo di tempo tra l'inizio del contesto di blocco in cui una variabile è dichiarata con let o const e il momento in cui la variabile è inizializzata. Durante questo intervallo, la variabile esiste tecnicamente nel contesto, ma non può essere accessibile.
Se tenti di accedere alla variabile prima che sia inizializzata, JavaScript solleva un errore di tipo ReferenceError.
Esempio pratico
console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 5;
In questo esempio, la variabile x è dichiarata con let. Anche se appare dopo il console.log, JavaScript "vede" che esiste una dichiarazione let x nel blocco corrente e la mette in una zona protetta (la TDZ) finché non viene eseguita l’inizializzazione.
Differenza con var
Con var, le variabili sono hoistate (spostate in alto) e inizializzate come undefined, quindi non causano errori di riferimento se accedute prima della dichiarazione.
console.log(y); // undefined
var y = 10;
Con let e const, invece, le variabili vengono anch'esse "hoistate", ma non inizializzate. Ecco perché la TDZ esiste.
Un altro esempio: blocchi
{
console.log(a); // ReferenceError
let a = 3;
}
Anche nei blocchi, se cerchi di accedere alla variabile prima che sia inizializzata, sei nella TDZ.
Caso con funzioni
function test() {
console.log(value); // ReferenceError
let value = "ciao";
}
Stesso comportamento: la variabile value è nella TDZ dall'inizio della funzione fino alla sua dichiarazione.
TDZ con const
La TDZ si comporta allo stesso modo con const, con l’ulteriore vincolo che una variabile const deve essere inizializzata al momento della dichiarazione.
console.log(a); // ReferenceError
const a = 10;
Oltre l'ovvietà
let e const si comportano rispetto a var, e come possono causare errori anche in situazioni meno banali.🧠 Esempio 1: Parametri default e TDZ
function example(a = b, b = 2) {
console.log(a, b);
}
example();
👉 Errore: ReferenceError: Cannot access 'b' before initialization
Anche se b è dichiarato nel parametro, nel momento in cui a cerca di usare b, b non è ancora stato inizializzato — è nella TDZ!
🧠 Esempio 2: TDZ in closure
{
// TDZ per i
const funcs = [];
for (let i = 0; i < 3; i++) {
funcs.push(() => console.log(i)); //add function to array
}
// Qui i è fuori dalla TDZ, tutto OK
funcs[0](); // 0
funcs[1](); // 1
funcs[2](); // 2
}Qui non c’è errore, ma è importante sapere che ogni iterazione del ciclo ha una nuova binding per i grazie a let, ed è per questo che le funzioni stampano 0, 1, 2 invece di 3, 3, 3 (come accadrebbe con var).
In un ciclo for con var, invece:
const funcs = [];
for (var i = 0; i < 3; i++) {
funcs.push(() => console.log(i));
}
funcs[0](); // 3
funcs[1](); // 3
funcs[2](); // 3Perché esiste la TDZ?
La Temporal Dead Zone è una scelta voluta nel linguaggio per:
-
Rendere il codice più sicuro: aiuta a evitare bug silenziosi dovuti all’utilizzo di variabili non inizializzate.
-
Riflettere un comportamento più prevedibile: forza lo sviluppatore a dichiarare e inizializzare correttamente le variabili prima del loro utilizzo.
Conclusione
La Temporal Dead Zone può sembrare inizialmente una fonte di confusione, ma serve a promuovere una scrittura di codice più chiara e meno soggetta a errori. Usare let e const in modo consapevole, evitando di accedere a variabili prima della loro dichiarazione, ti aiuterà a scrivere codice JavaScript più robusto e affidabile.
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment
