Hoe closures state vastleggen
Begrijp de lexicale omgeving van closures.
Hoe closures state vastleggen is een gratis JavaScript Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject JavaScript Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus JavaScript Academy bevat in totaal 4 lessen.
Wat is een closure
Een closure is een functie die samen met verwijzingen naar de variabelen uit het bereik waarin ze is gedefinieerd, wordt verpakt. De binnenste functie "onthoudt" die variabelen, zelfs nadat de buitenste functie is geretourneerd.
function outer() {
const message = "hello";
function inner() {
console.log(message); // sees outer variable
}
inner();
}
outer(); // "hello"De binnenste functie retourneren
De werking wordt zichtbaar wanneer je de binnenste functie retourneert. Die houdt toegang tot de variabele van de buitenste functie, ook al is outer al gestopt met uitvoeren.
function outer() {
const message = "remembered";
return function () {
console.log(message);
};
}
const fn = outer();
fn(); // "remembered"Lexicale reikwijdte
Closures werken dankzij lexicale bereikbepaling: een functie kan variabelen benaderen die in de bereiken staan die haar in de broncode fysiek omsluiten, niet in het bereik van waaruit ze wordt aangeroepen.
const x = 10;
function show() {
console.log(x); // resolves where defined
}
function run() {
const x = 99;
show(); // still logs 10, not 99
}
run();Vastleggen via verwijzing
Een closure legt de variabele zelf vast, niet een momentopname van de waarde. Als de variabele later verandert, ziet de closure de nieuwe waarde.
function make() {
let count = 0;
const get = () => count;
count = 5; // changed after get defined
return get;
}
console.log(make()()); // 5Elke aanroep maakt een nieuw bereik
Elke aanroep van de buitenste functie maakt een nieuwe verzameling variabelen. Closures uit verschillende aanroepen delen geen toestand.
function counter() {
let n = 0;
return () => ++n;
}
const a = counter();
const b = counter();
console.log(a(), a()); // 1 2
console.log(b()); // 1 (independent)Closures over parameters
Ook functieparameters worden vastgelegd. Zo kun je gespecialiseerde functies opbouwen vanuit een algemene functie.
function adder(x) {
return (y) => x + y;
}
const add5 = adder(5);
console.log(add5(3)); // 8
console.log(add5(10)); // 15De klassieke lusvalkuil
Een bekende bug: als je var in een lus gebruikt, delen alle closures één variabele. Tegen de tijd dat ze worden uitgevoerd, is de lus afgelopen en zien ze allemaal de eindwaarde.
const fns = [];
for (var i = 0; i < 3; i++) {
fns.push(() => i);
}
console.log(fns[0](), fns[1](), fns[2]()); // 3 3 3Oplossen met let
let maakt per iteratie een nieuwe binding, zodat elke closure zijn eigen i vastlegt. Dit is de moderne oplossing.
const fns = [];
for (let i = 0; i < 3; i++) {
fns.push(() => i);
}
console.log(fns[0](), fns[1](), fns[2]()); // 0 1 2Closures houden geheugen in leven
Zolang een closure bestaat, kunnen de variabelen die deze vastlegt niet door de garbagecollector worden opgeruimd. Meestal is dat geen probleem, maar het kan geheugenlekken veroorzaken als je closures langer bewaart dan nodig.
function make() {
const big = new Array(3).fill("data");
return () => big.length;
}
const f = make();
console.log(f()); // 3 - big stays in memory via fClosures zijn overal
Callbacks, gebeurtenishandlers, setTimeout, arraymethoden en promises gebruiken allemaal closures om context te onthouden. Je gebruikt ze voortdurend, vaak zonder het te merken.
function greet(name) {
return () => console.log("Hi " + name);
}
[greet("Ada"), greet("Bob")].forEach((fn) => fn());
// Hi Ada
// Hi BobVastgelegde toestand bekijken
Meerdere closures uit dezelfde aanroep delen dezelfde vastgelegde variabelen, dus de ene kan lezen wat de andere schrijft.
function pair() {
let value = 0;
return {
set: (v) => { value = v; },
get: () => value
};
}
const p = pair();
p.set(42);
console.log(p.get()); // 42Korte controle
Hoe closures toestand vastleggen.
Samenvatting
Een closure is een functie plus verwijzingen naar het bereik waarin deze is gedefinieerd. Dankzij lexicaal bereik onthoudt de closure variabelen uit de buitenste functie nadat die is teruggekeerd, en legt deze de variabelen vast via verwijzing, niet via waarde. Elke aanroep van de buitenste functie maakt een onafhankelijk bereik; gebruik let om de lusvalkuil te vermijden. Closures houden vastgelegd geheugen in leven en vormen overal de basis voor callbacks.
Leer JavaScript met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 59
- Lessen
- 200
Veelgestelde vragen
Is de les “Hoe closures state vastleggen” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad JavaScript Academy, waaronder “Hoe closures state vastleggen”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus JavaScript Academy bevat in totaal 4 lessen.
Wat leer ik in “Hoe closures state vastleggen”?
Begrijp de lexicale omgeving van closures. Je oefent met JavaScript Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met JavaScript Academy te beginnen?
Ervaring vooraf is niet nodig. JavaScript Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “Hoe closures state vastleggen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over JavaScript Academy?
Ja. Elke les over JavaScript Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Hoe closures state vastleggen
- Private variabelen met closures
- Het modulepatroon (IIFE)
- Factoryfuncties