← JavaScript

Scope y hoisting

¿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 let o const. La variable ya está registrada, pero no inicializada, así que si la uso de antemano obtengo un ReferenceError. Es una protección: con var, usar la variable antes de tiempo devolvía undefined en silencio, lo que causaba errores; con let y const, el error es explícito."

Reto rápido

¿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.