Avanzado
Closures
Objetivo: Explotar el cierre léxico para crear funciones con estado privado y módulos simples.
Explicación
Una closure ocurre cuando una función interna accede a variables de una función externa incluso después de que la externa haya terminado.
Usos prácticos:
1. Estado privado: contadores, configuración, caches.
2. Fábricas de funciones: funciones que generan funciones con parámetros preconfigurados.
3. Módulos: exponer una API pública y ocultar el estado interno.
Cuidado común: capturar variables de bucles con var produce sorpresas (todas las iteraciones comparten la misma variable). Con let cada iteración tiene su propio binding.
Ejemplos
function crearContador() {
let cuenta = 0
return () => ++cuenta
}
const contador = crearContador()
console.log(contador()) // 1
console.log(contador()) // 2
console.log(contador()) // 3function crearSaludo(saludo) {
return (nombre) => `${saludo}, ${nombre}`
}
const hola = crearSaludo('Hola')
console.log(hola('Ada')) // "Hola, Ada"
console.log(hola('Grace')) // "Hola, Grace"const fns = []
for (var i = 0; i < 3; i++) {
fns.push(() => i)
}
console.log(fns.map(f => f())) // [3, 3, 3] (misma variable)
// Con let: [0, 1, 2]Comprueba tu comprensión
Pregunta 1 de 5
Práctica opcional
Estos ejercicios no afectan tu dominio de la lección.
- Implementa un módulo crearCaja() que retorne { guardar, obtener, contar } usando una closure para el estado interno.
- Reemplaza el bucle con var del ejemplo por let y verifica que cada closure capture su propio i.