Scope, hoisting y TDZ: por qué tu variable existe (o falla) en cada línea
Domina alcance léxico, elevación y zona temporal muerta para evitar ReferenceError, corregir sombras de variables y escribir funciones más predecibles.
Cuando aparece un `ReferenceError`, casi nunca es magia: suele ser un problema de scope o de orden de ejecución en tu código.
Esta lección te enseña a pensar como el motor de JavaScript: qué declara primero, qué inicializa después y qué puedes leer en cada bloque.
Entender `hoisting` y `TDZ` te evita bugs muy caros en formularios, módulos y callbacks asíncronos.
Además, te prepara para closures y diseño de funciones limpias en lecciones siguientes.
- Tres ideas conectadas que explican por qué una variable funciona en un sitio y rompe en otro.
- `Scope` define dónde puedes acceder a una variable. `Hoisting` explica qué declaraciones se procesan antes de ejecutar línea a línea. `TDZ` marca el tramo donde `let/const` existen pero aún no pueden usarse.
- Si entiendes esta triada, tus errores dejan de ser aleatorios y se vuelven totalmente rastreables.
- El contexto donde declaras una variable determina quién puede verla.
- JavaScript usa alcance léxico: no importa desde dónde llames una función, importa dónde fue definida.
Mapa conceptual: scope, hoisting y TDZ
Tres ideas conectadas que explican por qué una variable funciona en un sitio y rompe en otro.
`Scope` define dónde puedes acceder a una variable. `Hoisting` explica qué declaraciones se procesan antes de ejecutar línea a línea. `TDZ` marca el tramo donde `let/const` existen pero aún no pueden usarse.
Si entiendes esta triada, tus errores dejan de ser aleatorios y se vuelven totalmente rastreables.
Scope léxico: el bloque manda
El contexto donde declaras una variable determina quién puede verla.
JavaScript usa alcance léxico: no importa desde dónde llames una función, importa dónde fue definida.
En código real, esta idea es crucial al trabajar con handlers de eventos y funciones internas.
Hoisting real sin mitos
No todo se eleva igual: declara una cosa, inicializa otra.
Las declaraciones `function` quedan disponibles antes de su línea. Con `var`, la declaración se eleva pero su valor inicial es `undefined` hasta asignación. Con `let/const`, hay hoisting, pero no acceso antes de inicializar (TDZ).
Por eso conviene declarar variables al inicio del bloque y funciones auxiliares antes de su primer uso, para mejorar legibilidad del flujo.
TDZ (Temporal Dead Zone): error útil, no enemigo
La TDZ te protege de usar variables antes de tiempo.
La TDZ empieza al entrar en el bloque y termina en la línea donde inicializas `let/const`.
Ese `ReferenceError` temprano evita bugs silenciosos que antes con `var` podían pasar desapercibidos durante mucho tiempo.
- Si ves TDZ, revisa orden de declaración e inicialización.
- No mezcles definición y uso en bloques largos sin estructura.
- Prefiere funciones pequeñas para reducir contexto mental.
Shadowing y nombres: evita confusión accidental
Puedes redeclarar en bloque interno, pero hazlo con criterio.
Shadowing ocurre cuando una variable interna tapa otra externa con el mismo nombre. No siempre es error, pero sí una fuente frecuente de confusión.
En equipos, renombrar de forma semántica (`precioBase`, `precioConIva`) suele ser mejor que reutilizar `precio` en todos lados.