Funkció hatókör és blokk hatókör
Amikor egy változót egy függvényen belül deklarálsz, a változó a függvényen belül le van kötve, és a függvényen kívül nem tudsz hozzáférni hozzá. A var
a kulcsszó, amellyel egy változót definiálhatunk függvényhatáron belüli elérhetőségre.
Most azt kérdezhetjük, ha a let
vagy a const
használata esetén is hibát ad, akkor miért csak a var
kapcsolódik a függvényhatárhoz? Az a helyzet, hogy a let
és a const
a blokk hatókör meghatározására szolgál, és az ES6 előtt a JavaScriptnek nem volt blokk hatókör, illetve let
és const
.
A blokk hatókör a
if
,switch
feltételeken vagyfor
éswhile
ciklusokon belüli terület. Egyszerűen fogalmazva , valahányszor {szögletes zárójelben} látja, az egy blokk.
Lássunk egy példát:
Most azt várhatnánk, hogy egyik naplóparancs sem fog működni, de mint láthatjuk, ez nem így van a var esetében, a var-val definiált változók a if
, switch
feltételek vagy a for
és while
ciklusokon belül globálisan elérhetők és a globális hatókör részét képezik, ezért jobb gyakorlat a let
és const
használata velük.
Lexikai hatókör
Végre elérkeztünk a bejegyzés valódi céljához. Nos, kihagyhattam volna a terjedelem hosszú tárgyalását, de személy szerint nem hiszem, hogy a lexikai terjedelem megértéséhez ismernünk kell a körülötte forgó legfontosabb összetevőket.
Még egyszer egy megjegyzendő pont:
Egyszerű szavakkal ez azt jelenti, hogy a gyermek hatókör hozzáfér a szülő hatókörben definiált változókhoz. Ha például definiálnék egy függvényt, és azon belül deklarálnék egy változót, és ugyanezen függvényen belül definiálnék egy másik függvényt, akkor a lexikális hatókör miatt képesnek kellene lennem arra, hogy ezt a változót a belső függvényen belül használjam. Lássunk egy példát:
A példából látható, hogy a outerFunction()
-ben deklarált változókat a innerfunction()
segítségével érjük el, ez a lexikális scoping.
A változók hatókörét a kódban elfoglalt pozíciójuk határozza meg. A változók feloldásához a JavaScript a legbelső hatókörből indul, és addig keres kifelé, amíg meg nem találja a keresett változót. A fenti példában a Javascript először a innerFunction()
belső tartományon belüli változókat keresi, és ha nem találja, akkor kívülre megy, azaz outerFunction()
A lineáris hatókör jobb, mert a kódból könnyen kideríthetjük egy változó értékét, míg a dinamikus hatókörben a változó jelentése futás közben változhat, ami bonyolulttá teszi a megértést.
Sikeresen megértettük tehát, hogy mi a lexikális scoping, most nézzük meg a lezárásokat, ahol a lexikális scopinget ténylegesen használják.