Articles

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 boatNamevá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 aboatNamevá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 boatNamevá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.