Tillämpning av funktioners lexikaliska miljö i JavaScript
Låt oss säga att vi har en funktion som returnerar en annan funktion som sitt resultat:
function test() {
return function() {
}
}
Om den överordnade funktionen har några variabler kommer dessa variabler att ingå i den returnerade funktionens lexikaliska miljö:
function test() {
let num = 1; // variabel i den överordnade funktionen
return function() {
// lexikaliskt miljö = {num: 1}
}
}
Låt oss skriva console.log i koden för vår returnerade funktion
som skriver ut värdet på variabeln
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Låt oss nu anropa den överordnade funktionen
test och spara resultatet av dess exekvering
i variabeln func:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
Den returnerade funktionen kommer att sparas i variabeln func.
Låt oss anropa vår funktion - som sitt resultat kommer den att skriva ut innehållet i variabeln
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // skriver ut 1
Om man däremot bara försöker skriva ut variabeln
num utanför funktionen kommer den inte att vara tillgänglig:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // variabeln num är inte tillgänglig här
Som du ser har den lokala variabeln num
bundits till vår funktions lexikaliska miljö och nu, genom att anropa
denna funktion var som helst i koden,
kan vi få värdet på variabeln
num, även om variabeln i sig inte är tillgänglig på platsen
där den anropas.
Faktum är att ett liknande resultat kan
uppnås genom att göra variabeln num global:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // global variabel
let func = test();
func(); // skriver ut 1
Men här kommer det att finnas en betydande skillnad:
i det nya alternativet kan variabeln num
ändras utanför funktioner (eftersom den är global),
medan det i det gamla alternativet inte går.
Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Avgör, utan att köra koden, vad som kommer att skrivas ut i konsolen:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());