Lecciones del módulo (4/4)
Closures y ámbito
Una closure (cierre o clausura) es una función que "recuerda" las variables del ámbito (scope) en el que fue definida, incluso después de que ese ámbito haya terminado. Parece magia, pero es una consecuencia directa de las reglas del scope.
Ámbito en cadena (Scope chain)
Una función puede leer variables declaradas fuera de sí misma, subiendo por la cadena de scopes:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // legge dalla closure
}
moltiplicaPer10(3); // 30Fábrica de funciones (Factory)
El patrón más común: una función que devuelve otra función, "personalizada" con los parámetros recibidos.
function creaSaluto(prefisso) {
return function (nome) {
return `${prefisso}, ${nome}!`;
};
}
const ciao = creaSaluto('Ciao');
const buongiorno = creaSaluto('Buongiorno');
ciao('Anna'); // 'Ciao, Anna!'
buongiorno('Marco'); // 'Buongiorno, Marco!'Cada llamada a creaSaluto crea un scope separado, con su propio prefisso.
Contador con estado privado
El ejemplo clásico: una closure que mantiene un contador sin exponerlo al exterior.
function creaContatore() {
let n = 0;
return function () {
n++;
return n;
};
}
const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3
const c2 = creaContatore();
c2(); // 1 ← stato isolato!n es privado: nadie fuera de la closure puede leerlo o modificarlo.
Pruébalo tú mismo
Implementa una fábrica `makeCounter()` que devuelva una función: cada llamada a dicha función debe devolver un entero progresivo a partir de 1. Contadores diferentes deben ser independientes.
Mostrar pista
Declara n con let dentro de makeCounter, luego devuelve una función que haga ++n.
Solución disponible después de 3 intentos
Ejercicio de repaso
Implementa `makeAdderWith(base)` que devuelva una función: dado un número n, devuelva base + n. Cada sumador debe recordar su propia base.
Mostrar pista
Devuelve una arrow function que use base del parámetro externo.
Solución disponible después de 3 intentos