Aplikácia lexikálneho prostredia funkcií v JavaScripte
Majme funkciu, ktorá ako svoj výsledok vracia inú funkciu:
function test() {
return function() {
}
}
Ak rodičovská funkcia má nejaké premenné, tieto premenné budú obsiahnuté v lexikálnom prostredí vrátenej funkcie:
function test() {
let num = 1; // premenná rodičovskej funkcie
return function() {
// lexikálne prostredie = {num: 1}
}
}
Napíšme v kóde našej vrátenej funkcie
console.log, ktorý vypíše hodnotu premennej
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Poďme teraz zavolať rodičovskú funkciu
test a výsledok jej práce zapíšme
do premennej func:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
Do premennej func sa zapíše vrátená
funkcia. Poďme zavolať našu funkciu - ako svojím
výsledkom vypíše obsah premennej
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // vypíše 1
Ak sa jednoducho pokúsime vypísať premennú
num mimo funkcie - bude nedostupná:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // premenná num tu je nedostupná
Ako vidíte, lokálna premenná num
sa naviazala na lexikálne prostredie našej
funkcie a teraz, zavolaním na akomkoľvek mieste kódu
túto funkciu, môžeme získať hodnotu
premennej num, aj keby v mieste
volania sama o sebe táto premenná bola nedostupná.
V skutočnosti podobný výsledok je možné
dosiahnuť vytvorením premennej num globálnou:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // globálna premenná
let func = test();
func(); // vypíše 1
Tu však bude podstatný rozdiel:
v novom variante premennú num je možné
meniť mimo funkcií (keďže je globálna),
kdežto v starom - nie.
Určite, bez spustenia kódu, čo sa vypíše do konzoly:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Určite, bez spustenia kódu, čo sa vypíše do konzoly:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Určite, bez spustenia kódu, čo sa vypíše do konzoly:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Určite, bez spustenia kódu, čo sa vypíše do konzoly:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());