🔄 Currying vs Closure in JavaScript: Perché sembrano uguali?

  


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.

🔗 Ti piace Techelopment? Dai un'occhiata al sito per tutti i dettagli!

🧠 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) in moltiplica(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