Lezioni del modulo (4/4)
Closure e scope
Una closure è una funzione che "ricorda" le variabili dello scope in cui è stata definita, anche dopo che quello scope è terminato. Sembra magia ma è una conseguenza diretta delle regole di scope.
Scope a catena
Una funzione può leggere variabili dichiarate fuori da sé, risalendo la catena degli scope:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // legge dalla closure
}
moltiplicaPer10(3); // 30Factory di funzioni
Il pattern più tipico: una funzione che ritorna un'altra funzione, "personalizzata" coi parametri ricevuti.
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!'Ogni chiamata a creaSaluto crea uno scope separato, con il proprio prefisso.
Contatore con stato privato
Il classico esempio: una closure che mantiene un contatore senza esporlo all'esterno.
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 è privato: nessuno fuori dalla closure può leggerlo o modificarlo.
Prova tu
Implementa una factory `makeCounter()` che ritorna una funzione: ogni chiamata della funzione restituisce un intero progressivo a partire da 1. Contatori diversi devono essere indipendenti.
Mostra suggerimento
Dichiara n con let dentro makeCounter, poi return una funzione che fa ++n.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Implementa `makeAdderWith(base)` che ritorna una funzione: dato un numero n, restituisce base + n. Ogni sommatore ricorda la propria base.
Mostra suggerimento
return una arrow function che usa base dal parametro esterno.
Soluzione disponibile dopo 3 tentativi