V JavaScriptu, stejně jako v mnoha jiných programovacích jazycích, existuje koncept jmenného prostoru. Toto je klíčový koncept, který pomáhá izolovat bloky kódu od sebe, což vede k čistšímu, organizovanějšímu kódu, který je méně náchylná k chybám.
Jmenným prostorem myslíme oblast kódu, ve které jsou definovaná určité proměnné a funkce. Vnořené jmenné prostory se můžou zanořovat a tím pádem mají hierarchickou strukturu. Tím se myslí to,že je blok kódu zanořen do jiného bloku kódu a dochází ke vzniku zanořeného jmenného prostoru. Pro práci na větších projektech je nutná znalost používání této techniky, protože má vliv na to, jakým způsobem organizujeme bloky kódu do snadno udržovatelných skupin, které sdílí určitá data a jsou jednoznačně identifikovatelné. Také tento přístup dokáže zabránit mnoha konfliktům mezi proměnnými a funkcemi a zajišťuje se bezpečnější a čistší kód.
Vytvoření blokového prostoru (scope)
S podporou ES6 a klíčovými slovy let
a const
vznikla podpora blokového scope
Tento scope se vytváří každým blokem kódu, který je ohraničen složenými závorkami {}
, jako jsou funkce, cykly nebo podmínky.
Proměnné a funkce definované uvnitř zanořeného jmenného prostoru jsou lokální, což znamená, že jsou přístupné pouze uvnitř tohoto bloku. Proměnné definované uvnitř vnitřní funkce nejsou přístupné mimo tuto funkci, včetně vnější funkce, ve které je vnitřní funkce definována.
Vnitřní funkce tedy má přístup k proměnným ve svém vlastním lokálním scopu, stejně jako k proměnným v jakémkoliv nadřazeném (obklopujícím) scopu, až do globálního scopu. Tento princip se nazývá "lexikální scoping" nebo "statický scoping".
Často se vytváří nové paměťové prostory při volání funkce (nebo vstupu do bloku). Po jejím vykonání a návratu z funkce je tento paměťový prostor uvolněn.
Ukázka
const globalVar = "Jsem globální proměnná"; // Global scope
function outerFunction() {
const outerVar = "I'm an outer variable"; // Local scope of outerFunction
function innerFunction() {
const innerVar = "I'm an inner variable"; // Local scope of innerFunction
console.log(globalVar); // Accessible
console.log(outerVar); // Accessible
console.log(innerVar); // Accessible
}
innerFunction();
console.log(globalVar); // Accessible
console.log(outerVar);
// Accessible
console.log(innerVar); // Not accessible, ReferenceError
}
outerFunction();
console.log(globalVar); // Accessible
console.log(outerVar); // Not accessible, ReferenceError
console.log(innerVar); // Not accessible, ReferenceError
Closure (uzávěra)
JavaScript podporuje uzávěry, což znamená, že vnitřní funkce si pamatuje svůj obor platnosti, i když jsou volány mimo svůj původní obor platnosti. Uzávěry jsou důležité pro vytváření soukromých proměnných, modulárního kódu a funkcí vyššího řádu.