Scope en JavaScript: global, función y bloque

Clase 17 de 39Curso de Fundamentos de JavaScript

Resumen

Comprender el scope en JavaScript es clave para escribir código confiable: define dónde una variable existe y cómo puede usarse. Aquí verás, paso a paso, cómo operan los ámbitos global, de función y de bloque, qué impacto tiene el hoisting, por qué usar let y const, y cómo evitar errores típicos con console.log, return y undefined.

¿Qué es el scope en JavaScript y por qué importa?

El scope es el alcance donde una variable existe y puede ser accedida. Se relaciona directamente con variables, funciones y bloques. En JavaScript, se trabaja con tres niveles principales:

  • Global: accesible desde cualquier parte del archivo.
  • De función: accesible solo dentro de la función donde se declara.
  • De bloque: accesible solo dentro de llaves, por ejemplo en un if.

También influye el hoisting: la elevación de declaraciones puede generar comportamientos confusos con var. Evítalo usando let y const. Además, evita nombrar variables con palabras reservadas como function, incluso si en español no choca, para no crear ambigüedad.

¿Cómo funcionan los ámbitos global, de función y de bloque?

Partimos con un ejemplo sencillo para visualizar el alcance real de cada variable, sus lecturas en memoria y la ejecución de arriba hacia abajo.

// doce-scope.js
// Alcances: global, función, bloque

const global = 'Soy global';

function ejemplo() {
  const mensajeFuncion = 'Soy de función';

  if (true) { // bloque
    const mensajeBloque = 'Soy de bloque';
    console.log(mensajeBloque); // dentro del bloque: OK
  }

  console.log(mensajeFuncion); // dentro de la función: OK
}

// Invocar la función: recuerda los paréntesis
console.log(ejemplo()); // no retorna valor: imprime undefined
console.log(global); // accesible en cualquier parte

Claves prácticas: - Dentro del bloque del if, solo existe lo declarado ahí. - Dentro de la función, puedes acceder a lo declarado en la función y también a lo global. - Fuera de la función, no puedes acceder a lo declarado dentro de ella.

¿Cómo evitar errores con return, undefined y accesos fuera de alcance?

Si una función no tiene return, su resultado es undefined, aunque internamente haga console.log. Y si intentas leer una variable fuera de su alcance, obtendrás un error que rompe la ejecución.

function ejemplo() {
  const mensajeFuncion = 'Soy de función';

  if (true) {
    const mensajeBloque = 'Soy de bloque';

    // Template literals para ver el contexto
    console.log(`Bloque: ${mensajeBloque}`); // OK
    console.log(`Bloque: ${mensajeFuncion}`); // sube al scope de función: OK
    console.log(`Bloque: ${global}`); // sube al scope global: OK
  }

  console.log(`Función: ${mensajeFuncion}`); // OK

  // OJO: esto causaría error porque mensajeBloque no existe aquí
  // console.log(`Función: ${mensajeBloque}`);

  // Sin return explícito: la función devuelve undefined
}

// Fuera de la función
// OJO: esto causaría error porque mensajeFuncion no existe fuera
// console.log(`Global: ${mensajeFuncion}`);

console.log(`Global: ${global}`); // OK

ejemplo();

Buenas prácticas para prevenir fallos: - Define variables en el alcance donde realmente se necesiten. - Limita lo global: úsalo solo si la variable debe estar disponible en todo el programa. - Invoca funciones con paréntesis para ejecutar su contenido. - Usa console.log para inspeccionar valores, no como sustituto de return. - Evita nombres conflictivos con palabras reservadas como function. - Identifica bloques por sus llaves: cada par de llaves crea un nuevo alcance de bloque.

Conceptos y habilidades reforzadas: - Lectura del flujo: variables y funciones se asignan en memoria y se ejecutan de arriba hacia abajo. - Diferencia entre mensajes en consola y valores devueltos por una función: console.log no reemplaza a return y, sin return, obtendrás undefined. - Uso de template literals para formatear salidas y evidenciar el alcance de cada variable.

¿Te animas al reto? prueba mover variables entre ámbitos global, de función y de bloque, y observa qué puedes acceder en cada contexto. Si aparece un error de variable no definida, verifica su alcance y ajusta dónde se declara.

¿Qué casos de scope te han costado más? comparte tu enfoque y soluciones en comentarios.

      Scope en JavaScript: global, función y bloque