En closure er en funksjon som er pakket sammen med referanser til variabler fra sitt omgivende (leksikalske) scope. På grunn av closures har en indre funksjon tilgang til sin ytre funksjons variabler selv etter at den ytre funksjonen har returnert.
js
function makeCounter() {
let count = 0; // private variable, captured by the closure
return {
inc: () => ++count, // each closure "remembers" its own count
get: () => count,
};
}
const a = makeCounter();
const b = makeCounter(); // independent closure — separate count
a.inc(); a.inc(); // a.get() → 2
b.inc(); // b.get() → 1 (a is untouched)
count er ikke tilgjengelig fra utsiden — bare inc/get kan se den. Det er dataprivacy bygget fra en closure. Og hvert kall til makeCounter() oppretter et friskt, isolert scope.
Klassisk loop-bug
js
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0); // prints 3, 3, 3 — all share one `i`
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0); // prints 0, 1, 2 — `let` is per-iteration
}
Med var lukker hver callback over den samme i (som er 3 når de kjører). let oppretter en ny binding hver iterasjon.
Hvorfor det er viktig
Closures driver moduleprivacy, memoization, currying, event handlers/callbacks som husker state, og er nøyaktig hvordan React hooks (useState) opprettholder verdier mellom renders.
