Anvendelse af funktioners leksikalske omgivelse i JavaScript
Lad os sige, at vi har en funktion, der returnerer en anden funktion som sit resultat:
function test() {
return function() {
}
}
Hvis den overordnede funktion har nogen variabler, vil disse variabler være indeholdt i den returnerede funktions leksikalske omgivelse:
function test() {
let num = 1; // variabel i den overordnede funktion
return function() {
// leksikalsk omgivelse = {num: 1}
}
}
Lad os skrive console.log i koden af vores returnerede funktion,
som udskriver værdien af variablen
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Lad os nu kalde den overordnede funktion
test og gemme resultatet af dens udførelse
i variablen func:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
Den returnerede funktion vil blive gemt i variablen func.
Lad os kalde vores funktion - som sit resultat vil den udskrive indholdet af variablen
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // udskriver 1
Hvis man derimod bare forsøger at udskrive variablen
num uden for funktionen - vil den være utilgængelig:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // variablen num er ikke tilgængelig her
Som du kan se, blev den lokale variabel num
bundet til vores funktions leksikalske omgivelse, og nu, ved at kalde
denne funktion hvor som helst i koden,
kan vi få værdien af variablen num, selvom variablen i sig selv
ikke er tilgængelig på kaldstedet.
Faktisk kan man opnå et tilsvarende resultat
ved at gøre variablen num global:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // global variabel
let func = test();
func(); // udskriver 1
Her vil der dog være en væsentlig forskel:
i den nye version kan variablen num
ændres uden for funktioner (da den er global),
men i den gamle - kan den ikke.
Bestem, uden at køre koden, hvad der vil blive udskrevet i konsollen:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Bestem, uden at køre koden, hvad der vil blive udskrevet i konsollen:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Bestem, uden at køre koden, hvad der vil blive udskrevet i konsollen:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Bestem, uden at køre koden, hvad der vil blive udskrevet i konsollen:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());