Toepassing van lexicale omgeving van functies in JavaScript
Stel we hebben een functie die als resultaat een andere functie teruggeeft:
function test() {
return function() {
}
}
Als de bovenliggende functie variabelen heeft, dan zullen deze variabelen bevat zijn in de lexicale omgeving van de teruggegeven functie:
function test() {
let num = 1; // variabele van de bovenliggende functie
return function() {
// lexicale omgeving = {num: 1}
}
}
Laten we in de code van onze teruggegeven functie
console.log schrijven,
die de waarde van variabele
num uitvoert:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Laten we nu de bovenliggende functie
test aanroepen
en het resultaat ervan opslaan
in variabele func:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
In variabele func wordt de teruggegeven
functie opgeslagen. Laten we onze functie aanroepen - als
resultaat zal het de inhoud van variabele
num uitvoeren:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // geeft 1 weer
Als je simpelweg probeert de variabele
num buiten de functie uit te voeren - zal deze niet beschikbaar zijn:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // variabele num is hier niet beschikbaar
Zoals je ziet, is de lokale variabele num
verbonden met de lexicale omgeving van onze
functie en nu, door deze functie waar dan ook in de code
aan te roepen, kunnen we de waarde
van variabele num verkrijgen,
zelfs als op de aanroeplocatie
deze variabele op zich niet beschikbaar is.
Eigenlijk kan een vergelijkbaar resultaat
bereikt worden door variabele num globaal te maken:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // globale variabele
let func = test();
func(); // geeft 1 weer
Hier zal echter een essentieel verschil zijn:
in de nieuwe variant kan variabele num
aangepast worden buiten de functies (omdat deze globaal is),
terwijl dat in de oude - niet kan.
Bepaal, zonder de code uit te voeren, wat in de console wordt weergegeven:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Bepaal, zonder de code uit te voeren, wat in de console wordt weergegeven:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Bepaal, zonder de code uit te voeren, wat in de console wordt weergegeven:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Bepaal, zonder de code uit te voeren, wat in de console wordt weergegeven:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());