Articles

Pokusil bych se vysvětlit lexikální rozsah v prosté angličtině. Přej mi štěstí

Při psaní článku o uzavírkách a ŽIVOT o několik dní zpět. Snažil jsem se vysvětlit lexikální rozsah krátkým a jednoduchým způsobem. Všiml jsem si, že článek byl stále větší a větší, tak jsem se rozhodl psát o lexikální rozsah zvlášť.
V tomto článku bych se pokusil vysvětlit základy lexikálního rozsahu, co to znamená, a uvést příklady, které vám pomohou pochopit, jak to funguje v JavaScriptu. Žádná buzzwords…Slibuju.

nejprve rozeberme slovo „lexikální rozsah“.

rozsah

nejprve si povíme o jednoduchém: rozsah.
V jednoduché angličtině, rozsah může říct:

  • ohraničení
  • oblast
  • prostředí

Nebo nějaké jiné synonymum.

pamatujete si, jak jste sledovali tutoriál, kde vám instruktor řekne, že určitá myšlenka / téma je nad rámec videa?
Nebo když tým z jiného oddělení pracuje na projektu, a řekněte jim, chcete-li přidat funkci si myslíte, že je v pohodě a řeknou vám: „to je nad rámec tohoto projektu“.
myslím, že chápete podstatu. Rozsah je prostě region, kde je dovoleno něco fungovat v daném časovém období.

v informatice by to mohlo znamenat oblast, kde některá data existují a jsou přístupná. Tato data by mohla být něco jako proměnná.

V jazyce, jako je JavaScript, bychom mohli definovat rozsah vytvořením bloku pomocí složených závorek: {...}. Nazýváme tento blok rozsah. To znamená, že proměnné deklarované uvnitř tohoto bloku lze přistupovat pouze v této oblasti. Tato oblast pokrývá vše uvnitř, včetně dalších dětských / vnitřních bloků vytvořených v této oblasti.
jinými slovy tato oblast je local a její proměnné nemohou být přímo přístupné z vnějšího světa. Takže by se to dalo nazvat místním rozsahem.
proměnné deklarované uvnitř funkcí jsou v lokálním rozsahu funkce.

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); 

Nyní jste možná slyšeli o globálním rozsahu dříve. To je prostředí, které není uzavřeno v bloku. Každý kód ve vašem prostředí Javascript má přístup k němu. Toto je otevřené prostředí JavaScript. Takže níže uvedený kód by měl fungovat.

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

Jedna věc, kterou si uvědomit:

působnosti má přístup k jeho rodič působnosti, ale rodič působnosti nemá přímý přístup k proměnné deklarované ve vnitřním rozsahu.

funkce má přístup do name protože je funkce deklarované v globálním rozsahu a name existuje v globálním měřítku. Pokud jméno bylo deklarované uvnitř doSomething() funkce, pak kód v globální rozsah nelze změnit hodnotu name přímo, protože name je místní funkce.

věřím, že dobře rozumíte tomu, co rozsah znamená. Jednoduše to znamená oblast nebo prostředí, kde proměnná existuje a lze k ní přistupovat nebo ji upravovat.

nyní hovoříme o“lexikálním“

lexikálním

abychom porozuměli lexikálnímu, podívejme se nejprve na slovo, ze kterého je odvozeno: Lexikon.
Lexikon byl odvozen z latinského slova: „lexis“, což znamená“slovo“
v prosté angličtině:

Lexikon jednoduše znamená slovník. V pořadí slov to znamená slovní zásobu jazyka člověka. Je to jako kniha, kde je uložen význam/definice slov.

kdykoli chcete najít význam slova, přejdete do lexikonu.
nedíváte se na to, kde se slovo používá, a hádáte, co to znamená a jeho obsah nebo hodnotu. Vždy jdete lexikon, kde je účel slova vytvořen a jasně definován.

nyní s tímto vysvětlením:

lexikální jednoduše znamená něco, co souvisí s lexikonem. Jinými slovy to znamená něco, co souvisí se slovy nebo slovní zásobou jazyka člověka. Něco se týkalo vytvoření nebo definice slov.

promluvme si o lexikálním rozsahu.

lexikální rozsah

význam těchto dvou slov jsme viděli v prosté angličtině.
s těmito znalostmi definujme lexikální rozsah v prosté angličtině:

lexikální rozsah jednoduše znamená, že oblast, ve které slovo existuje, je určena tím, kde bylo definováno nebo vytvořeno.

Další definice by byla:

Lexikální Rozsah znamená, že význam/hodnotu slovo může být určena pouze podle regionu/prostředí, kde byl vytvořen.

lexikální rozsah znamená, že přímo nezadáváte význam slova lidem z vnější oblasti, která toto slovo používá. Je to proto, že lexikální klade důraz na původ, kde byl vytvořen / definován.

dobře, uvedu příklad.
použijme slovo: „Tanec“.
slovo „tanec“ bylo vytvořeno / definováno v Británii. Britové znají jeho význam. Toto slovo existuje v rozsahu, ve kterém bylo vytvořeno: „Británie“. Wales je v Británii, takže Wales má přístup k tomuto slovu (pamatujte, že jsme již vysvětlili, proč výše). Velšští lidé tak mohou aktualizovat význam tohoto slova tak, aby vyhovoval jejich místnímu dialektu. Je to proto, že jsou v rámci Británie.

Němci nemohou přímo přijít a změnit význam tohoto slova. Je to proto, že slovo nebylo vytvořeno v Německu. Takže pokud by Němci chtěli použít anglické slovo: „tanec“ a toto slovo ještě nebylo vytvořeno Británií, toto slovo by nebylo k dispozici bez ohledu na to, jak moc se snaží. To by nikdo neznal skutečný význam tohoto slova v Německu, protože slovo v britském lexikonu neexistuje. (Nebojte se, pokud se to zdá blábol, vysvětlím s kódem později)

Jelikož jsme studenti Vědy a nikoli Lingvisté, pojďme nahradit „slovo“ s „proměnnou“.

naše nová definice by byla:

lexikální rozsah jednoduše znamená, že oblast, ve které existuje proměnná, je určena tím, kde byla definována nebo vytvořena.

lexikální rozsah znamená, že význam / hodnota proměnné může být určena pouze oblastí / prostředím, kde byla vytvořena.

lexikální rozsah znamená, že přímo nezadáváte význam proměnné do kódu z vnější oblasti (bloku), která proměnnou používá. Je to proto, že lexikální klade důraz na původ, kde byla proměnná vytvořena / definována.

takže lexikální rozsah nám ukazuje, že proměnnou lze použít pouze v rozsahu, ve kterém byla vytvořena, a ne tam, kde byla volána.

podívejme se, jak to funguje v kódu:

function rideBritishBoat() { let boatName = "Queen's Dab"; // local variable return `Driving ${boatName}`}function rideGermanBoat() { const status = rideBritishBoat(); return status;}rideGermanBoat();

výše uvedený příklad simuluje scénář, kdy Němci koupili loď z Británie….(Dalo by se to vyměnit, která země jste want…no musím bojovat, proč jsem nezmínil nějakou jinou zemi. To jsou jen názvy zemí a ne knihovny JavaScriptu 😛 ).
rideGermanBoat() používá rideBritishBoat().
, Protože JavaScript používá lexikální rozsah, při provádění rideBritishBoat() funkce, to jde, kde to bylo vytvořeno a dostane referenční proměnné: boatName. Takže s lexikálním rozsahem, kdykoli je spuštěn rideBritishBoat(), JavaScript jde do rozsahu funkce a hledá proměnné použité v této funkci.

Poznámka: rozsah funkce rideBritishBoat() je její lokální rozsah a globální rozsah. rideGermanBoat() není v lexikální rozsah rideBritishBoat() funkce, protože rideBritishBoat() nebyl vytvořen uvnitř.

nyní trochu změníme příklad:

function rideBritishBoat() { return `Driving ${boatName}`; // Reference Error: boatName not defined}function rideGermanBoat() { let boatName = "Merkel's Dab"; const status = rideBritishBoat(); return status;}rideGermanBoat();

výše uvedený kód selže. Funkce rideBritishBoat() nejsou přesné. Při pokusu o přístup k boatName v příkazu return selže.

proč?

je to proto, že JavaScript používá lexikální rozsah.
jak to funguje, když narazí na proměnnou boatName uvnitř funkce rideBritishBoat(), hledá, kde byla proměnná boatName vytvořena v řetězci Scope. To znamená, že veškerý možný rozsah této funkce, která je: místní rozsah funkce, pak kontroluje její uzavřený rozsah v tomto případě globální rozsah.

tak JavaScript kontroluje proměnné. Nejprve zkontroluje místní blok, ve kterém je aktuální proměnná použita, aby zjistila, zda tam byla deklarována. Kdyby to nebylo, pak to jde až do obvodových rozsah a pokračuje, pokud se nenajde prohlášení, až se dosáhne vrcholu řetězce, což je globální rozsah,

Tam je jeden další typ Scoping názvem „Dynamický Scoping“.
předchozí kód by fungoval v jazyce, který podporuje dynamický rozsah (např. Lisp).
je to proto, že v dynamicky zaměřeném prostředí je proměnná kontrolována za běhu. Co je to znamená, že při spuštění rideGermanBoat() a provedení se dostane do rideBritishBoat() běhové prostředí zkontroluje hodnotu boatName, kde kód je v současné době běží. V tomto případě to najde, takže žádný problém, a kód funguje na očekávané a vytiskne Driving Merkel's Dab.

lexikální rozsah se také nazývá statický rozsah, protože jeho rozsah je určen v době kompilace. To znamená, že je to prostředí / rozsah je pevná a nemůže jen změnit. Jinými slovy, proměnné lze volat pouze z bloku kódu, ve kterém byl deklarován / vytvořen.

dynamický rozsah se nazývá dynamický, protože jeho prostředí (vnější rozsah) se může změnit. Jinými slovy, proměnné lze volat z vnějšku bloku, který jsou vytvořeny.

takže bychom mohli mít jinou funkci, která používá rideBritishBoat() s názvem rideMauritianBoat():

function rideMauritianBoat() { let boatName = "Flying Dodo's Dab"; const status = rideBritishBoat(); return status;}rideMauritianBoat();

V dynamicky rozsahem jazyk, můžete vidět hodnotu boatName proměnné uvnitř rideBritishBoat() je závislá na rozsahu, ve kterém je spuštěn. Jak vidíme, tento rozsah se může změnit, je tedy dynamický.
uvnitř rideBritishBoat() hovory boatName proměnnou rideMauritianBoat(), který je mimo jeho blok scope.

to je dynamický rozsah a lexikální rozsah je opak.

ale nezapomeňte, že JavaScript není dynamicky rozsahem. To je jen ukázat vám rozdíl.

lexikální stanovení rozsahu kontroly pro proměnné v čase kompilace (proměnné musí být vytvořen a přístupné v rozsah/blok je použit), zatímco dynamické stanovení rozsahu kontroly pro proměnné v době běhu (proměnné nemusí být vytvořen v působnosti při kompilaci, ale může být přítomen, když je funkce spuštěna).

starší Devs být jako: vole!! JavaScript není kompilovaný jazyk!!
Prosím, nechme ten rozhovor na jindy. Jen se pokuste dostat zprávu, kterou předávám.
dobře, jsem naštvaný právě teď. Tady je cvičení pro vás.

rychlé cvičení

jaký by byl výstup této funkce?

function rideBritishBoat() { let boatName = "Queen's Dab"; function rideWelshBoat() { boatName = "Welsh Royal Boat"; console.log(boatName) } rideWelshBoat();}rideBritishBoat()

Shrnutí

cílem tohoto článku bylo vysvětlit lexikální scoping v jednoduchým způsobem s použitím základní gramatiky a krátké příklady. Pokud jste si všimli, že některá slova jsou tučně. To jsou klíčová slova pro pochopení tohoto konceptu. Navíc mám spoustu alternativních definic stejných pojmů. To bylo provedeno pro vás vybrat, který z nich klesá v snadno pro vás. Různé tahy pro různé lidi 😉

Z toho, co jsme se naučili výše, můžeme říci, že:

  • rozsah je prostředí/oblast, ve které existuje něco (proměnná)
  • rozsah může přistupovat ke svým rodičům.
  • Nadřazený rozsah nemá přímý přístup k proměnným deklarovaným ve vnitřním rozsahu.
  • lexikální má co do činění s tím, kde byla proměnná deklarována / vytvořena.
  • lexikální rozsah vynucuje nalezení proměnných z rozsahu / bloku, který byly vytvořeny / deklarovány, a nikoli z prostředí, ve kterém běží.
  • dynamický rozsah je opakem lexikálního rozsahu.
  • dynamický rozsah kontroluje proměnné z místa, kde jsou spuštěny.

Díky za přečtení.
Uvidíme se v příštím příspěvku.