Megpróbálom elmagyarázni a lexikai hatókört egyszerű angol nyelven. Kívánj szerencsét
miközben cikket írok a bezárásokról és az életről néhány nappal ezelőtt. A lexikális hatókört próbáltam röviden és egyszerűen megmagyarázni. Észrevettem, hogy a cikk egyre nagyobb lesz, ezért úgy döntöttem, hogy külön írok a lexikális hatókörről.
ebben a cikkben megpróbálom elmagyarázni a lexikális hatókör alapjait, mit jelent, és példákat adok, amelyek segítenek megérteni, hogyan működik a JavaScript-ben. Nincsenek hívószavak…Megígérem.
először bontsuk le a “lexikai hatókör”szót.
hatókör
először a könnyebbről beszélünk: hatókör.
egyszerű angol nyelven a hatókör jelentheti:
- határ
- régió
- környezet
vagy bármilyen más szinonimát, amelyre gondolhat.
emlékszel egy oktatóanyagra, ahol az oktató elmondja, hogy egy bizonyos ötlet/téma túlmutat a videó hatókörén?
vagy amikor egy másik részleg csapata dolgozik egy projekten, és azt mondja nekik, hogy adjanak hozzá egy olyan funkciót, amelyet jónak tart, és azt mondják: “ez túlmutat a projekt hatókörén”.
Nos, azt hiszem, érted a lényeget. A hatókör egyszerűen egy olyan régió,ahol valami megengedett egy adott időszakban.
a számítástechnikában ez olyan régiót jelenthet, ahol bizonyos adatok léteznek és hozzáférhetők. Ez az adat lehet valami változó.
egy olyan nyelven, mint a JavaScript, definiálhatunk egy hatókört egy blokk létrehozásával göndör zárójelekkel: {...}
. Ezt a blokk hatókörnek nevezzük. Ez azt jelenti, hogy az ebben a blokkban deklarált változók csak ebben a régióban érhetők el. Ez a régió mindent magában foglal, beleértve az adott régióban létrehozott egyéb gyermek / belső blokkokat is.
más szóval ez a régió local
és változói nem érhetők el közvetlenül a külvilágból. Tehát ezt nevezhetjük helyi hatókörnek.
A függvényeken belül deklarált változók a függvény helyi hatókörébe tartoznak.
function doSomething() { let name = "john"; console.log(name)}doSomething(); // Prints 'john'// would produce a Reference error// because name is local to doSomething() function's scopeconsole.log(name);
lehet, hogy hallottál már a globális hatókörről. Nos, ez egy olyan környezet, amely nem zárt egy blokkban. A Javascript környezet minden kódja hozzáférhet hozzá. Ez a nyílt JavaScript környezet. Tehát az alábbi kódnak működnie kell.
let name = "john"; // In the global scopefunction doSomething() { name = "James" console.log(name); // The function can access the global scope variable 'name'}doSomething(); // Prints "James"console.log(name); // Can access 'name' too
egy dolgot meg kell jegyezni:
a hatókörnek van hozzáférése a szülő hatóköréhez, de a szülő hatókörnek nincs közvetlen hozzáférése a belső hatókörben deklarált változókhoz.
a függvény hozzáférhet a name
– hez, mert a függvény a globális hatókörben van deklarálva, és name
létezik a globális hatókörben. Ha a név a doSomething()
függvényen belül lett deklarálva, akkor a globális hatókörben lévő kód nem tudja közvetlenül megváltoztatni a name
értékét, mert a name
Helyi a függvényhez.
azt hiszem, jól megérted, hogy mit jelent a hatókör. Ez egyszerűen olyan régiót vagy környezetet jelent, ahol egy változó létezik, és elérhető vagy módosítható.
most beszéljünk a “lexikális”
lexikális
a lexikális megértéséhez először nézzük meg azt a szót, amelyből származik: Lexikon.
Lexikon származik a latin szó: “lexis”, ami azt jelenti, hogy”szó”
egyszerű angol nyelven:
a lexikon egyszerűen szótárt jelent. A szavak sorrendjében ez egy személy nyelvének szókincsét jelenti. Olyan, mint egy könyv, ahol a szavak jelentését/meghatározását tárolják.
Ha meg akarja találni egy szó jelentését, akkor lépjen a lexikonba.
nem nézed meg, hogy hol használják a szót, és kitalálod, mit jelent, és annak tartalmát vagy értékét. Mindig a lexikonba megy, ahol a szó célja létrejön és világosan meg van határozva.
most ezzel a magyarázattal:
a lexikális egyszerűen a lexikonnal kapcsolatos valamit jelent. Más szavakkal, ez azt jelenti, hogy valami kapcsolódik az ember nyelvének szavaihoz vagy szókincséhez. Valami a szavak létrehozásával vagy meghatározásával kapcsolatos.
beszéljünk a lexikális hatókörről.
lexikális hatókör
láttuk a két szó jelentését egyszerű angol nyelven.
ezzel a tudással definiáljuk a lexikai hatókört egyszerű angol nyelven:
a lexikális hatókör egyszerűen azt jelenti, hogy azt a régiót, amelyben egy szó létezik, az határozza meg, hogy hol definiálták vagy hozták létre.
további meghatározások:
a lexikális hatókör azt jelenti, hogy egy szó jelentését/értékét csak az a régió/környezet határozhatja meg, ahol létrehozták.
a lexikális hatókör azt jelenti, hogy nem közvetlenül kiszervezi a szó jelentését a szót használó külső régióból származó embereknek. Ennek oka az, hogy a lexical hangsúlyt fektet az eredetre, ahol létrehozták/meghatározták.
Oké, adok egy példát.
használjuk a “tánc”szót.
A” tánc ” jött létre/meghatározott Nagy-Britanniában. A britek tudják a jelentését. Ez a szó abban a körben létezik, amelyben létrehozták: “Nagy-Britannia”. Wales Nagy-Britanniában van, így Wales hozzáférhet ehhez a szóhoz (ne feledje, hogy a fentiekben már kifejtettük, miért). Tehát a walesi emberek frissíthetik ennek a szónak a jelentését, hogy megfeleljenek a helyi nyelvjárásuknak. Ez azért van, mert Nagy-Britannia hatálya alá tartoznak.
a németek nem tudják közvetlenül megváltoztatni ennek a szónak a jelentését. Ez azért van, mert a szót nem Németországban hozták létre. Tehát, ha a németek az angol “tánc” szót akarnák használni, és ezt a szót még nem hozta létre Nagy-Britannia, akkor ez a szó nem lenne elérhető, bármennyire is próbálkoznak. Ez arra késztetné senkit, hogy megismerje ennek a szónak a tényleges jelentését Németországban, mert a szó nem létezik a brit lexikonban. (Ne aggódjon, ha ez halandzsának tűnik, később kóddal magyarázom)
mivel természettudományos hallgatók vagyunk, nem nyelvészek, cseréljük le a “szót” a “változóra”.
az új definíció lenne:
a lexikális hatókör egyszerűen azt jelenti, hogy azt a régiót, amelyben egy változó létezik, az határozza meg, hogy hol definiálták vagy hozták létre.
a lexikális hatókör azt jelenti, hogy egy változó jelentését/értékét csak az a régió / környezet határozhatja meg, ahol létrehozták.
a lexikális hatókör azt jelenti, hogy nem közvetlenül kiszervezi a változó jelentését egy olyan külső régióból(blokkból) származó kódra, amely a változót használja. Ez azért van, mert lexical helyezi a hangsúlyt a származási, ahol a változó jött létre / definiált.
tehát a lexikális hatókör azt mutatja, hogy egy változó csak abban a hatókörben használható, amelyben létrehozták, nem pedig ott, ahol hívták.
lássuk, hogyan működik ez a kódban:
function rideBritishBoat() { let boatName = "Queen's Dab"; // local variable return `Driving ${boatName}`}function rideGermanBoat() { const status = rideBritishBoat(); return status;}rideGermanBoat();
a fenti példa egy olyan forgatókönyvet szimulál, amelyben a németek hajót vásároltak Nagy-Britanniából….(Lehet cserélni, hogy melyik országban valaha want…no meg kell küzdenem, hogy miért nem említettem egy másik országot. Ezek csak országnevek, és nem JavaScript könyvtárak ).
a rideGermanBoat()
használja a rideBritishBoat()
.
mivel a JavaScript lexikális hatókört használ, a rideBritishBoat()
függvény végrehajtásakor oda megy, ahol létrehozták, és megkapja a változó hivatkozását: boatName
. Tehát a lexikális hatókörrel, amikor a rideBritishBoat()
végrehajtásra kerül, a JavaScript a függvény hatókörébe kerül, hogy megkeresse a függvényben használt változókat.
megjegyzés: arideBritishBoat()
függvény hatóköre a helyi hatókör és a globális hatókör. A rideGermanBoat()
nem tartozik a rideBritishBoat()
függvény lexikális hatókörébe, mert a rideBritishBoat()
nem jött létre benne.
most változtassuk meg egy kicsit a példát:
function rideBritishBoat() { return `Driving ${boatName}`; // Reference Error: boatName not defined}function rideGermanBoat() { let boatName = "Merkel's Dab"; const status = rideBritishBoat(); return status;}rideGermanBoat();
a fenti kód sikertelen. ArideBritishBoat()
funkciók nem pontosak. Sikertelen, amikor megpróbálja elérni aboatName
értéket a return utasításban.
miért?
Ez azért van, mert a JavaScript lexikális hatókört használ.
Hogyan működik ez, amikor találkozik boatName
változó belsejében rideBritishBoat()
függvény, úgy néz ki, ahol a boatName
változó jött létre annak hatálya lánc. Vagyis a függvény minden lehetséges hatóköre, amely a: A függvény helyi hatóköre, majd ellenőrzi a körülzáró hatókörét, ebben az esetben a globális hatókört.
tehát így ellenőrzi a JavaScript A változókat. Először ellenőrzi a helyi blokkot, amelyben az aktuális változót használják, hogy megtudja, ott deklarálták-e. Ha nem, akkor felmegy a körülzáró hatókörbe, és tovább megy, ha nem talál deklarációt, amíg el nem éri a lánc tetejét, amely a globális hatókör
van egy másik típusú hatókör, az úgynevezett “dinamikus hatókör”.
az előző kód olyan nyelven működne, amely támogatja a dinamikus hatókört(pl. Lisp).
Ez azért van, mert egy dinamikusan hatókörű környezetben a változó futási időben kerül ellenőrzésre. Ez azt jelenti, hogy amikor végrehajtja a rideGermanBoat()
parancsot, és a végrehajtás a rideBritishBoat()
értékre kerül, a futásidejű környezet ellenőrzi a boatName
értékét, ahol a kód jelenleg fut. Ebben az esetben megtalálja, így nincs probléma, és a kód a várt módon működik, és kiírja a Driving Merkel's Dab
.
a lexikális hatókört statikus hatókörnek is nevezik, mert a hatókörét fordításkor határozzák meg. Ez azt jelenti, hogy a környezet/hatókör rögzített, és nem tud csak úgy megváltozni. Más szavakkal, a változókat csak abból a kódblokkból lehet meghívni, amelyben deklarálták/létrehozták.a
dinamikus hatókört dinamikusnak nevezzük, mert a környezete (külső hatóköre) megváltozhat. Más szavakkal, a változókat meg lehet hívni azon a blokkon kívülről, amelyet létrehoztak.
tehát lehetne egy másik függvényünk, amely a rideBritishBoat()
nevű rideMauritianBoat()
:
function rideMauritianBoat() { let boatName = "Flying Dodo's Dab"; const status = rideBritishBoat(); return status;}rideMauritianBoat();
dinamikusan ható nyelven láthatja aboatName
változó értékét arideBritishBoat()
függ a hatókörtől, amelyben végrehajtják. Amint láthatjuk, hogy ez a hatókör változhat, ezért dinamikus.
tehát belül rideBritishBoat()
, felhívja a boatName
változó rideMauritianBoat()
amely kívül esik a blokk hatókörén.
Ez a dinamikus hatókör, a lexikális hatókör pedig az ellenkezője.
de ne feledje, a JavaScript nem dinamikusan hatókör. Ez csak azért van, hogy megmutassa a különbséget.
tehát a lexikális hatókör ellenőrzi a változókat fordítási időben (a változókat létre kell hozni és hozzáférhetővé kell tenni a használt hatókörben/blokkban), míg a dinamikus hatókör futási időben ellenőrzi a változókat (előfordulhat, hogy a változók nem jönnek létre a hatókörben fordításkor, de jelen lehetnek a függvény futásakor).
Senior Devs legyen olyan, mint: haver!! A JavaScript nem lefordított nyelv!!
kérem, hagyjuk ezt a beszélgetést egy másik napra. Csak próbáld meg megkapni az üzenetet, amit átadok.
Oké, most dühös vagyok. Itt egy gyakorlat az Ön számára.
gyors gyakorlat
mi lenne ennek a funkciónak a kimenete?
function rideBritishBoat() { let boatName = "Queen's Dab"; function rideWelshBoat() { boatName = "Welsh Royal Boat"; console.log(boatName) } rideWelshBoat();}rideBritishBoat()
összefoglaló
a cikk célja az volt, hogy a lexikális hatókört egyszerű módon, az alapvető nyelvtan és rövid példák felhasználásával magyarázza. Ha észrevetted, hogy néhány szó félkövér. Ezek a kulcsszavak ennek a koncepciónak a megértéséhez. Plusz, sok alternatív definícióm van ugyanazokról a fogalmakról. Ez azért történt, hogy kiválassza, melyik süllyed könnyen az Ön számára. Különböző stroke különböző emberek számára
abból, amit fent tanultunk, azt mondhatjuk, hogy:
- a hatókör olyan környezet/régió, amelyben valami (változó) létezik
- a hatókör elérheti a szüleit.
- a szülő hatókör nem rendelkezik közvetlen hozzáféréssel a belső hatókörben deklarált változókhoz.
- a Lexikálisnak köze van ahhoz, hogy egy változó hol lett deklarálva / létrehozva.
- a lexikális hatókör a létrehozott/deklarált hatókör / blokk változóinak keresését kényszeríti ki, nem pedig azt a környezetet, amelyben futnak.
- a dinamikus hatókör a lexikális hatókör ellentéte.
- dinamikus hatókör ellenőrzi a változókat, ahonnan futnak.
köszönöm az olvasást.
találkozunk a következő bejegyzésben.