DevPath · Aprende a programar ESPTEN

Scope, hoisting y closures

Closures

Un closure es una función que recuerda dónde nació

Vamos con la idea estrella del módulo, y no es tan difícil como suena.

Imagina que cada función, al nacer, se lleva una mochila con las variables que tenía a mano en ese momento. Aunque la función viaje a otra parte del programa y ese lugar de nacimiento ya no exista, sigue cargando su mochila y puede mirar dentro. Eso es un closure: una función que recuerda el mundo donde nació.

¿Por qué te importa? Porque los closures están detrás de cosas que usas a diario: contadores, generadores de IDs únicos, datos privados que nadie puede tocar desde fuera, e incluso los hooks de React. Domina esto y media biblioteca moderna deja de parecer magia.

Ejemplo clásico: un contador con memoria

function crearContador() {
  let cuenta = 0;          // variable "privada"
  return function () {
    cuenta = cuenta + 1;   // recuerda y modifica cuenta
    return cuenta;
  };
}

const contador = crearContador();
console.log(contador()); // 1
console.log(contador()); // 2
console.log(contador()); // 3

La variable cuenta no existe fuera de crearContador: nadie puede leerla ni cambiarla desde fuera. Pero la función devuelta la lleva en su mochila, así que la recuerda y la actualiza entre llamadas. Acabas de crear un dato privado.

Cada closure tiene su propia mochila

const a = crearContador();
const b = crearContador();
console.log(a()); // 1
console.log(a()); // 2
console.log(b()); // 1 (independiente de a)

Cada llamada a crearContador reparte una mochila nueva, así que a y b no se pisan. Es como dar a cada usuario su propia caja fuerte.

¿Por qué importan en el mundo real?

Si interiorizas la mochila, has desbloqueado uno de los superpoderes de JavaScript.

Ejemplos

La mochila guarda el saludo: hola y adios recuerdan el suyo por separado

function crearSaludo(saludo) {
  return function (nombre) {
    return saludo + ", " + nombre;
  };
}
const hola = crearSaludo("Hola");
const adios = crearSaludo("Adiós");
console.log(hola("Ana"));   // "Hola, Ana"
console.log(adios("Ana"));  // "Adiós, Ana"
Pon esto en práctica

DevPath es un curso práctico: aquí lees la teoría; en la app la pones en práctica con ejercicios que se ejecutan de verdad, sin conexión.

Empezar gratis en la app →
← Hoisting (elevación)Ver el módulo →