Vai al contenuto
eLearner.app
Modulo 4 · Lezione 4 di 416/32 nel corso~12 min
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:

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // legge dalla closure
}

moltiplicaPer10(3); // 30

Factory di funzioni

Il pattern più tipico: una funzione che ritorna un'altra funzione, "personalizzata" coi parametri ricevuti.

JS
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.

JS
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

Esercizio#js.m4.l4.e1
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Dichiara n con let dentro makeCounter, poi return una funzione che fa ++n.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#js.m4.l4.e2
Tentativi: 0Caricamento…

Implementa `makeAdderWith(base)` che ritorna una funzione: dato un numero n, restituisce base + n. Ogni sommatore ricorda la propria base.

Caricamento editor…
Mostra suggerimento

return una arrow function che usa base dal parametro esterno.

Soluzione disponibile dopo 3 tentativi