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?
- Datos privados:
cuentaes intocable desde fuera, como un saldo que solo se mueve con la función que tú expones. - Generadores de IDs únicos: un closure que guarda el último número y devuelve el siguiente cada vez.
- Fábricas de funciones: crear funciones a medida (un multiplicador por 2, otro por 10) que recuerdan su configuración.
- React y compañía: los hooks como
useStatese apoyan justo en esta idea para recordar tu estado entre renders.
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"