![]() |
Se stai studiando JavaScript, probabilmente hai già incontrato due concetti fondamentali: closure e currying. Ma c’è un momento in cui qualcosa non torna: gli esempi che spiegano il currying... sembrano identici a quelli delle closure!
Spoiler: non è una coincidenza. In realtà, il currying si basa sulle closure per funzionare. In questo articolo esploreremo il legame tra i due concetti, vedremo esempi chiari e capiremo come usarli in modo efficace.
🧠 Closure: la funzione che si ricorda tutto
Una closure è una funzione che “ricorda” le variabili del contesto in cui è stata creata, anche se quel contesto non esiste più.
👇 Esempio:
function saluta(nome) {
return function(messaggio) {
console.log(`${messaggio}, ${nome}`);
};
}
const salutaMarco = saluta("Marco");
salutaMarco("Ciao"); // Output: Ciao, Marco
Qui salutaMarco è una closure: mantiene il valore di nome anche dopo che saluta ha finito di eseguire.
🍛 Currying: una funzione alla volta
Il currying è una tecnica di programmazione funzionale. Consiste nel trasformare una funzione che prende più argomenti in una serie di funzioni che prendono un solo argomento.
👇 Esempio:
function somma(a) {
return function(b) {
return a + b;
};
}
const somma5 = somma(5);
console.log(somma5(3)); // Output: 8
Qui abbiamo curried una funzione di due argomenti (a, b) in due funzioni annidate, ciascuna con un solo argomento.
🎯 Sembrano uguali? Per forza!
La somiglianza non è casuale: il currying funziona proprio grazie alle closure. Quando chiami somma(5), JavaScript crea una funzione che ricorda il valore di a grazie a una closure. Quando poi chiami somma5(3), quel valore viene recuperato dal contesto chiuso.
🔁 In altre parole:
Tutte le funzioni curried sono closure. Ma non tutte le closure sono curried.
Ma cosa significa davvero? Vediamo un esempio pratico di closure che non è currying.
✅ Esempio:
function creaContatore() {
let contatore = 0;
return function() {
contatore++;
console.log(`Contatore: ${contatore}`);
};
}
const incrementa = creaContatore();
incrementa(); // Contatore: 1
incrementa(); // Contatore: 2
La funzione interna restituita da creaContatore è una closure perché mantiene l'accesso alla variabile contatore, anche dopo che la funzione esterna è terminata.
Ma non è currying: non scompone parametri in funzioni annidate, non gestisce una sequenza di argomenti — semplicemente mantiene uno stato privato.
🔁 A confronto: una funzione curried
function moltiplica(a) {
return function(b) {
return a * b;
};
}
const per2 = moltiplica(2);
console.log(per2(5)); // 10
Questa invece è:
- una closure (ricorda il valore di
a) - e curried, perché trasforma
moltiplica(a, b)inmoltiplica(a)(b)
🧠 In sintesi
| Tipo | Closure? | Curried? |
|---|---|---|
creaContatore() |
✅ Sì | ❌ No |
moltiplica(a)(b) |
✅ Sì | ✅ Sì |
In breve: il currying è un uso specifico delle closure, ma le closure possono servire a moltissimi altri scopi come mantenere stato, creare API private o configurare comportamenti.
🧪 Differenza in breve
| Concetto | Closure | Currying |
|---|---|---|
| Cos'è | Una funzione che ricorda il suo scope | Una tecnica per dividere una funzione in più passaggi |
| Scopo | Incapsulare stato e contesto | Composizione, parziale applicazione, riusabilità |
| Esempio classico | salutaMarco("Ciao") |
somma(5)(3) |
🛠️ Quando usare cosa?
- Usa le closure per:
- mantenere uno stato privato
- creare funzioni configurabili
- evitare variabili globali
- Usa il currying per:
- comporre funzioni
- creare funzioni riutilizzabili
- migliorare leggibilità e flessibilità
🔚 Conclusione
Closure e currying sono due strumenti potenti nel tuo arsenale JavaScript. Capire che il currying è costruito sulle closure ti permette di padroneggiare entrambi i concetti in modo più naturale.
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment
