1 JavaScript scope en closures
In JavaScript is de scope de context waarin variabelen, functies, en objecten toegankelijk zijn. Een closure is een functie die toegang heeft tot de scope van een buitenliggende functie, zelfs nadat die buitenliggende functie is uitgevoerd. Deze concepten zijn essentieel om te begrijpen hoe variabelen werken en worden gebruikt in JavaScript.
1.1 Scope: global
Variabelen die buiten elke functie of blok zijn gedeclareerd, bevinden zich in de globale scope. Ze zijn toegankelijk vanuit elk deel van het bestand.
const globaleVariabele = "Ik ben globaal!";
function toonGlobaal() {
console.log(globaleVariabele); // Toegang tot de globale variabele
}
toonGlobaal(); // "Ik ben globaal!"
console.log(globaleVariabele); // "Ik ben globaal!"
1.1.1 Scope: function
Variabelen gedeclareerd binnen een functie zijn alleen toegankelijk binnen die functie. Dit wordt function scope genoemd.
function toonLokaal() {
let lokaleVariabele = "Ik ben lokaal!";
console.log(lokaleVariabele); // Toegang tot de lokale variabele
}
toonLokaal(); // "Ik ben lokaal!"
console.log(lokaleVariabele); // ReferenceError: lokaleVariabele is not defined
1.1.1 Scope: block
Variabelen gedeclareerd met let
of const
binnen een blok (bijvoorbeeld binnen een if
-statement of een for
-loop) zijn alleen toegankelijk binnen dat blok. Dit wordt block scope genoemd.
if (true) {
let blockVariabele = "Ik ben in een blok!";
console.log(blockVariabele); // Toegang tot de block-variabele
}
console.log(blockVariabele); // ReferenceError: blockVariabele is not defined
1.2 Closures
Een closure ontstaat wanneer een functie toegang heeft tot de scope van een buitenliggende functie, zelfs nadat die buitenliggende functie is voltooid. Dit stelt de functie in staat om “privé” variabelen en parameters te onthouden en ermee te werken.
function buiten() {
let binnenVariabele = "Ik ben binnen!";
function binnen() {
console.log(binnenVariabele); // Toegang tot binnenVariabele van buiten
}
return binnen;
}
let mijnClosure = buiten();
mijnClosure(); // "Ik ben binnen!"
Uitleg
- De functie
buiten
declareert een lokale variabelebinnenVariabele
en retourneert een functiebinnen
. - De functie
binnen
is een closure die toegang heeft tot de variabelebinnenVariabele
van de buitenliggende functiebuiten
, zelfs nadatbuiten
is voltooid. - Wanneer
mijnClosure
wordt aangeroepen, heeft het nog steeds toegang totbinnenVariabele
.
1.2.1 Closures: praktisch gebruik
Closures worden vaak gebruikt voor het maken van functies die ‘privégegevens’ onthouden, zoals functions die waarde bijhouden.
function teller() {
let count = 0;
return function() {
count++;
return count;
};
}
let mijnTeller = teller();
console.log(mijnTeller()); // 1
console.log(mijnTeller()); // 2
console.log(mijnTeller()); // 3
Uitleg
- De functie
teller
retourneert een functie die de waarde vancount
met 1 verhoogt en deze teruggeeft. - De variabele
count
blijft bewaard in de closure, waardoor elke aanroep vanmijnTeller
de waarde vancount
verhoogt en onthoudt.
2 Oefeningen JavaScript scope en closures
Hieronder staan enkele oefeningen betreffende scope en closures.
2.1 Oefening JavaScript scope global
Maak een globale variabele basis
en een functie vermenigvuldig
die deze variabele met een argument vermenigvuldigt en het resultaat teruggeeft.
console.log(vermenigvuldig(2)); // 10
console.log(vermenigvuldig(4)); // 20
2.2 Oefening JavaScript scope function
Schrijf een functie grootsteVanTwee
die twee getallen neemt en het grootste getal teruggeeft. Gebruik lokale variabelen binnen de functie.
console.log(grootsteVanTwee(3, 7)); // 7
console.log(grootsteVanTwee(10, 5)); // 10
2.3 Oefening JavaScript scope block
Schrijf een functie isEven
die een getal neemt en true
teruggeeft als het even is, anders false
. Gebruik een variabele met block scope om de status bij te houden.
console.log(isEven(4)); // true
console.log(isEven(7)); // false
2.4 Oefening JavaScript closures
Schrijf een functie maakVermenigvuldiger
die een getal (factor
) accepteert en een functie retourneert die een ander getal met deze factor
vermenigvuldigt.
const vermenigvuldigerMet5 = maakVermenigvuldiger(5);
console.log(vermenigvuldigerMet5(3)); // 15
console.log(vermenigvuldigerMet5(4)); // 20
const vermenigvuldigerMet10 = maakVermenigvuldiger(10);
console.log(vermenigvuldigerMet10(2)); // 20
console.log(vermenigvuldigerMet10(3)); // 30