Obsah funkce a rozsah bloku
Kdykoli deklarujete proměnnou uvnitř funkce, je tato proměnná vázána uvnitř funkce a mimo funkci k ní nemáte přístup. var
je klíčové slovo pro definici proměnné pro přístupnost v oboru funkce.
Teď se možná ptáte, když to dává chybu, i když použijete let
nebo const
, proč je s oborem funkce spojeno pouze var
? Jde o to, že let
a const
se používají k definování oboru bloku a před ES6 JavaScript neměl obor bloku ani let
a const
.
Obor bloku je oblast uvnitř podmínek
if
,switch
nebo smyčekfor
awhile
. Jednoduše řečeno , kdykoli uvidíte {kudrnaté závorky}, jedná se o blok.
Podívejme se na příklad:
Nyní byste možná čekali, že žádný z příkazů log by neměl fungovat, ale jak vidíte, u var tomu tak není, proměnné definované pomocí var uvnitř podmínek if
, switch
nebo cyklů for
a while
mohou být přístupné globálně a jsou součástí globálního oboru, a proto je lepší používat u nich let
a const
.
Lexikální rozsah
Nakonec jsme se dostali k pravému účelu tohoto příspěvku. No, mohl jsem přeskočit dlouhou diskusi o rozsahu, ale osobně si myslím, že nemůžete pochopit lexikální rozsah, aniž byste znali klíčové komponenty, které se kolem něj točí.
Znovu bod k zapamatování:
Zjednodušeně řečeno to znamená, že dětský obor má přístup k proměnným definovaným v rodičovském oboru. Pokud bych například definoval funkci a deklaroval v ní proměnnou a uvnitř téže funkce definoval další funkci, pak bych měl mít díky lexikálnímu rozsahu možnost používat tuto proměnnou uvnitř vnitřní funkce. Podívejme se na příklad:
Z příkladu je vidět, že k proměnným deklarovaným v outerFunction()
přistupuje innerfunction()
, jedná se o lexikální rozsah.
Obsah proměnných je definován jejich pozicí v kódu. Při řešení proměnných začíná JavaScript v nejvnitřnějším oboru a hledá směrem ven, dokud nenajde hledanou proměnnou. Ve výše uvedeném příkladu Javascript nejprve hledá proměnnou uvnitř innerFunction()
, a když ji nenajde, jde ven, tedy outerFunction()
Lexikální rozsah je lepší, protože z kódu snadno zjistíme hodnotu proměnné, zatímco u dynamického rozsahu se význam proměnné může za běhu měnit, což je složité na pochopení.
Úspěšně jsme tedy pochopili, co je to lexikální rozsah, nyní se podíváme na uzávěry, kde se lexikální rozsah skutečně používá.