Funciones y Lógicamiércoles, 21 de enero de 2026

Scope y Hoisting

¿Dónde viven tus variables?

Publicidad

Apoya a JS Fruggal visitando a nuestros patrocinadores.

Scope (Alcance) es el conjunto de reglas que determina dónde viven tus variables y dónde pueden ser accedidas. Hoisting (Elevación) es cómo el motor las organiza antes de ejecutar el código.

Analogía del Espejo Unidireccional

Piensa en los alcances como Ventanas de Auto Polarizadas:
De Adentro hacia Afuera: Si estás dentro del auto (Function Scope), puedes ver todo afuera (Global Scope).
De Afuera hacia Adentro: Si estás afuera, no puedes ver qué pasa dentro del auto. Las variables de adentro son privadas.

La Cadena de Alcance

Cuando usas una variable, JavaScript la busca en la habitación actual. Si no está allí, busca en la habitación exterior. Sigue subiendo hasta llegar al alcance Global.

const usuarioGlobal = "Admin";

function exterior() {
  const varExterior = "Estoy en el medio";
  
  function interior() {
    const varInterior = "Estoy en el fondo";
    
    // 1. ¿Busca en 'interior'? No.
    // 2. ¿Busca en 'exterior'? ¡Sí! Encontrado.
    console.log(varExterior); 
    
    // 1. ¿Busca en 'interior'? No.
    // 2. ¿Busca en 'exterior'? No.
    // 3. ¿Busca en Global? ¡Sí!
    console.log(usuarioGlobal);
  }
  
  interior();
}

exterior();

Hoisting: Las Variables "Fantasma"

Hoisting no es magia; es el compilador haciendo una "primera pasada" para encontrar todas las declaraciones de variables antes de ejecutar el código.

Comportamiento de variables durante Hoisting

  • function: Completamente elevada. Puedes llamarlas antes de definirlas.
  • var: Elevada pero inicializada como undefined.
  • let / const: Elevadas pero colocadas en la Zona Muerta Temporal (TDZ). Tocarlas bloquea la app.
// 1. Las funciones son seguras de usar antes
saludar(); 

function saludar() {
  console.log("¡Funciono porque fui elevada!");
}

// 2. Var es peligrosa
console.log(miVar); // undefined (No es error, solo vacío)
var miVar = 10;

// 3. Let/Const explotan
try {
  console.log(miLet);
} catch(e) {
  console.error("Error TDZ:", e.message);
}
let miLet = 20;
Publicidad

Apoya a JS Fruggal visitando a nuestros patrocinadores.