¿Qué es la Zona Muerta Temporal en JavaScript?
Ver respuesta — intenta responderla en voz alta primero
Es el periodo entre el inicio del bloque y la línea donde se declara una variable let o const. Si intentas usar la variable durante ese periodo, obtienes un ReferenceError.
Las variables let y const sí se registran (sufren "hoisting") al inicio del bloque, igual que var. La diferencia es que no se inicializan hasta que la ejecución llega a su línea de declaración. Ese espacio "muerto", donde la variable existe pero no se puede usar, es la Zona Muerta Temporal.
En realidad es una protección: evita que uses una variable antes de darle un valor, algo que con var ocurría en silencio (devolvía undefined y causaba errores difíciles de encontrar).
// La TDZ va desde el inicio del bloque hasta la declaración
{
// console.log(mensaje); // ReferenceError: Cannot access 'mensaje' before initialization
let mensaje = "hola";
console.log(mensaje); // "hola" — a estas alturas ya salió de la TDZ
}
// Comparación con var (que no tiene TDZ)
console.log(conVar); // undefined (sin error)
var conVar = 1;
// console.log(conLet); // ReferenceError (sí lanza error por la TDZ)
let conLet = 1;
Confundir la TDZ con "let no tiene hoisting". Sí lo tiene: la variable se registra al inicio del bloque. La diferencia con var es que no se inicializa hasta su línea, por eso lanza un error si la usas de antemano, en lugar de devolver undefined.
"La Zona Muerta Temporal es el espacio entre el inicio del bloque y la línea donde declaro una variable con
letoconst. La variable ya está registrada, pero no inicializada, así que si la uso de antemano obtengo un ReferenceError. Es una protección: convar, usar la variable antes de tiempo devolvíaundefineden silencio, lo que causaba errores; conletyconst, el error es explícito."
¿Qué pasa al ejecutar esto?
function prueba() {
console.log(valor);
let valor = 10;
}
prueba();
Ver respuesta
Lanza ReferenceError: Cannot access 'valor' before initialization. La variable valor está en la TDZ hasta su línea de declaración, así que no se puede usar de antemano.