| name | js-scope-debugging |
| description | Diagnosticar y arreglar bugs de scope en JavaScript vanilla: temporal dead zone, let vs var vs window, Object.defineProperty para sincronizar variables entre scripts. Patrones de safety net para overlays/loading states.
|
| tags | ["javascript","debugging","scope","vanilla-js","frontend"] |
JS Scope Debugging — Guía de diagnóstico y fixes
Problema clásico: script mata silenciosamente todo lo que viene después
Causa #1: Temporal Dead Zone (TDZ)
window.LLUVIA_CITIES = LLUVIA_CITIES;
const LLUVIA_CITIES = [...];
Diagnóstico:
typeof window.LLUVIA_CITIES
typeof setTxt
Fix: Mover window.X = X DESPUÉS de la declaración const/let.
Causa #2: let + window.map = map no sincroniza
let map = null;
window.map = map;
function initMap() {
map = L.map('map', ...);
}
Diagnóstico:
window.map
typeof window.map
window.map === null
Fix — Object.defineProperty:
Object.defineProperty(window, 'map', {
get() { return map; },
set(v) { map = v; },
configurable: true
});
Causa #3: Scripts cacheados por CDN/navegador
Síntoma: El código desplegado en GitHub es correcto, pero el navegador sirve versión vieja.
Fix: Bumpear version strings en index.html:
<script src="js/state.js?v=20260712143834"></script>
<script src="js/state.js?v=202607131345"></script>
Safety net patterns
Overlay que nunca se oculta
setTimeout(() => {
const ol = document.getElementById('loading-overlay');
if (ol && !ol.classList.contains('hidden')) {
ol.classList.add('hidden');
}
}, 10000);
init().catch(err => {
console.error('init() falló:', err);
document.getElementById('loading-overlay')?.classList.add('hidden');
});
Variables que necesitan sincronización cross-script
Para cada let en un script que se accede desde otro script via window.X:
Object.defineProperty(window, 'nombreVar', {
get() { return nombreVar; },
set(v) { nombreVar = v; },
configurable: true
});
window.X = X;
Checklist de diagnóstico rápido
typeof window.X → undefined = el script no ejecutó (TDZ o syntax error)
typeof window.X → "object" pero window.X === null = let-scoped null no sincronizado
- Código en GitHub OK pero navegador falla = cache busting necesario
- Overlay stuck = init() nunca resuelve → buscar promise sin catch
- Funciones
undefined en consola = script anterior falló silenciosamente
Errores comunes de JavaScript que parecen bugs de scope
| Error | Causa real |
|---|
X is not defined en eval() | const en eval tiene scope propio |
Cannot read property of null | Elemento DOM no existe aún |
| Script no ejecuta nada | Syntax error o TDZ mata todo |
map es null después de initMap() | let-scoped, no en window |
| Overlay forever loading | Promise sin .catch() |