Una closure è semplicemente una funzione che continua ad avere accesso alle variabili del contesto in cui è stata creata, anche dopo che quel contesto è terminato.

function contatore() {
  let count = 0;
  return function () {
    count += 1;
    return count;
  };
}

const next = contatore();
next(); // 1
next(); // 2  <- 'count' sopravvive tra le chiamate

La funzione interna "chiude" sopra la variabile count: non è globale, non si azzera, resta privata. È il meccanismo alla base di stato incapsulato, moduli e hook di React.

Se ti sei mai chiesto perché useState funziona, la risposta breve è: closure.