Aplikace lexikálního prostředí funkcí v JavaScriptu
Předpokládejme, že máme funkci, která svým výsledkem vrací jinou funkci:
function test() {
return function() {
}
}
Pokud má rodičovská funkce nějaké proměnné, budou tyto proměnné obsaženy v lexikálním prostředí vrácené funkce:
function test() {
let num = 1; // proměnná rodičovské funkce
return function() {
// lexikální prostředí = {num: 1}
}
}
Napišme v kódu naší vrácené funkce
console.log, který vypíše hodnotu proměnné
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Nyní zavolejme rodičovskou funkci
test a výsledek její práce zapišme
do proměnné func:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
Do proměnné func se zapíše vrácená
funkce. Zavolejme naši funkci - svým
výsledkem vypíše obsah proměnné
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // vypíše 1
Pokud se pokusíme jednoduše vypsat proměnnou
num mimo funkci - bude nedostupná:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // proměnná num je zde nedostupná
Jak vidíte, lokální proměnná num
se navázala na lexikální prostředí naší
funkce a nyní, když zavoláme tuto funkci na jakémkoli místě kódu,
budeme moci získat hodnotu
proměnné num, i když v místě
volání sama o sobě tato proměnná není dostupná.
Ve skutečnosti lze podobného výsledku
dosáhnout tím, že proměnnou num učiníme globální:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // globální proměnná
let func = test();
func(); // vypíše 1
Zde však bude podstatný rozdíl:
v nové variantě lze proměnnou num
měnit mimo funkce (protože je globální),
zatímco ve staré - ne.
Určete, bez spuštění kódu, co se vypíše do konzole:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Určete, bez spuštění kódu, co se vypíše do konzole:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Určete, bez spuštění kódu, co se vypíše do konzole:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Určete, bez spuštění kódu, co se vypíše do konzole:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());