⊗jsPmClLEA 261 of 505 menu

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());
Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout