Yrittäisin selittää leksikaalista laajuutta selkokielellä. Wish me luck
kirjoittaessaan artikkelia sulkemisista ja elämästä joitakin päiviä sitten. Yritin selittää leksikaalista soveltamisalaa lyhyellä ja yksinkertaisella tavalla. Huomasin artikkeli oli tulossa isompi ja isompi, joten päätin vain kirjoittaa noin lexical soveltamisala erikseen.
tässä artikkelissa pyrin selittämään sanastollisen soveltamisalan perusteet, mitä se tarkoittaa ja antamaan esimerkkejä, joiden avulla ymmärrät, miten se toimii Javascriptissä. Ei muotisanoja…Lupaan sen.
ensiksi eritellään sana ”leksikaalinen soveltamisala”.
scope
puhutaan ensin helposta: scope.
selkokielellä scope voi tarkoittaa:
- raja
- alue
- ympäristö
tai mitä tahansa muuta synonyymiä, jota voisi ajatella.
Muistatko katsoneesi opetusohjelman, jossa ohjaaja kertoo tietyn idean / aiheen olevan videon ulottumattomissa?
tai kun toisen osaston tiimi työskentelee projektissa ja käsket heidän lisätä ominaisuuden, joka on mielestäsi siisti, ja he sanovat: ”se on tämän projektin ulottumattomissa”.
No luulen, että ymmärrät asian ytimen. Soveltamisala on yksinkertaisesti alue, jolla jonkin sallitaan toimia tiettynä ajanjaksona.
tietojenkäsittelytieteessä tämä voi tarkoittaa aluetta, jossa on jonkin verran tietoa ja johon pääsee käsiksi. Nämä tiedot voivat olla muuttuja.
JavaScriptin kaltaisella kielellä voisi määritellä ulottuvuuden luomalla lohkon curly-henkselien avulla: {...}
. Kutsumme tätä Block Scopeksi. Tämä tarkoittaa, että tämän lohkon sisällä ilmoitettuja muuttujia voidaan käyttää vain tämän alueen sisällä. Tämä alue kattaa kaiken sen sisällä, mukaan lukien muut lapsi – /sisäosat, jotka on luotu kyseisellä alueella.
toisin sanoen Tämä alue on local
eikä sen muuttujiin voi suoraan päästä käsiksi ulkomaailmasta. Tätä voisi siis kutsua paikalliseksi tähtäimeksi.
funktioiden sisällä ilmoitetut muuttujat ovat funktion paikallisessa laajuudessa.
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);
nyt globaalista laajuudesta on voinut kuulla aiemminkin. Se on ympäristö, joka ei ole suljettu kortteliin. Jokainen koodi Javascript ympäristössä on pääsy siihen. Tämä on avoin JavaScript-ympäristö. Joten alla olevan koodin pitäisi toimia.
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
yksi huomioitava asia:
a soveltamisalalla on pääsy emoalueeseensa, mutta emoalalla ei ole suoraa pääsyä sisäisessä soveltamisalassa ilmoitettuihin muuttujiin.
funktiolla on pääsy name
koska funktio on ilmoitettu globaalissa laajuudessa ja name
on olemassa globaalissa laajuudessa. Jos nimi on ilmoitettu doSomething()
funktion sisällä, niin yleispiirin koodi ei voi muuttaa name
suoraan, koska name
on funktion paikallinen.
uskon, että teillä on hyvä käsitys siitä, mitä Laajuus tarkoittaa. Se vain yksinkertaisesti tarkoittaa aluetta tai ympäristöä, jossa muuttuja on olemassa ja jota voidaan käyttää tai muokata.
nyt puhutaan ”leksikaalista”
leksikaalista
ymmärtääkseen leksikaalista, katsotaan ensin sana, josta se on johdettu: Lexicon.
Lexicon oli johdettu latinan sanasta: ”lexis”, joka tarkoittaa”sanaa”
selkokielellä:
Lexicon tarkoittaa yksinkertaisesti sanakirjaa. Järjestyssanoilla se tarkoittaa henkilön kielen sanastoa. Se on kuin kirja, johon sanojen merkitys / määritelmä on tallennettu.
aina kun haluat löytää sanan merkityksen, menet sanastoon.
ei katsota, missä sanaa käytetään, ja arvailla, mitä se tarkoittaa ja sen sisältöä tai arvoa. Aina mennään sanastoon, jossa sanan tarkoitus on luotu ja määritelty selkeästi.
nyt sillä selityksellä:
leksikaalinen tarkoittaa yksinkertaisesti jotain sanastoon liittyvää. Toisin sanoen se tarkoittaa jotakin henkilön kielen sanastoon tai sanastoon liittyvää. Jotain, joka liittyy sanojen luomiseen tai määrittelyyn.
puhutaan leksikaalisesta laajuudesta.
leksikaalinen soveltamisala
olemme nähneet näiden kahden sanan merkityksen selvässä englannin kielessä.
sillä tiedolla, let ’ s define Lexical Scope in plain English:
leksikaalinen soveltamisala tarkoittaa yksinkertaisesti sitä, että alue, jolla sana on olemassa, määräytyy sen mukaan, missä se on määritelty tai luotu.
muut määritelmät olisivat:
sanallinen soveltamisala tarkoittaa, että sanan merkitys/arvo voidaan määrittää vain sen alueen / ympäristön mukaan, jolla se on luotu.
leksikaalinen soveltamisala tarkoittaa, että sanan merkitystä ei ulkoisteta suoraan sanaa käyttäville ulkopuolisille. Tämä johtuu siitä, että leksikaaliset painottavat alkuperää siitä, missä se luotiin/määriteltiin.
okei, annan esimerkin.
käytetään sanaa ”Tanssi”.
sana ”tanssi” luotiin/määriteltiin Britanniassa. Britannian kansa tietää sen merkityksen. Tämä sana on olemassa siinä laajuudessa, jossa se luotiin: ”Britannia”. Wales on Britanniassa, joten Walesilla on pääsy tähän sanaan (muista, että olemme jo selittäneet, miksi edellä). Walesilaiset voivat siis päivittää tämän sanan merkityksen paikalliseen murteeseensa sopivaksi. Tämä johtuu siitä, että ne ovat Britannian soveltamisalan sisällä.
saksalaiset eivät voi suoraan tulla muuttamaan tämän sanan merkitystä. Tämä johtuu siitä, että sanaa ei luotu Saksassa. Jos saksalaiset siis haluaisivat käyttää englanninkielistä sanaa ”dance”, jota Britannia ei ole vielä luonut, sitä sanaa ei olisi saatavilla, vaikka he kuinka yrittäisivät. Näin kukaan ei tietäisi tuon sanan todellista merkitystä Saksassa, koska sanaa ei ole olemassa Brittiläisessä sanakirjassa. (Älä huoli, jos tämä tuntuu siansaksalta, selitän koodilla myöhemmin)
koska olemme luonnontieteen opiskelijoita emmekä kielitieteilijöitä, niin korvataan ”sana” sanalla ”muuttuja”.
Uusi määritelmämme olisi:
leksikaalinen soveltamisala tarkoittaa yksinkertaisesti sitä, että alue, jolla muuttuja on olemassa, määräytyy sen mukaan, missä se on määritelty tai luotu.
leksikaalinen soveltamisala tarkoittaa, että muuttujan merkitys/arvo voidaan määrittää vain sen alueen / ympäristön mukaan, jolla se on luotu.
leksikaalinen soveltamisala tarkoittaa, että muuttujan merkitystä ei ulkoisteta suoraan koodille muuttujaa käyttävältä ulkoalueelta(lohkolta). Tämä johtuu siitä, että leksikaalinen painottaa origossa sitä, missä muuttuja luotiin / määriteltiin.
joten leksikaalinen soveltamisala osoittaa meille, että muuttujaa voidaan käyttää vain siinä laajuudessa, jossa se luotiin, eikä siinä, missä sitä kutsuttiin.
katsotaan, miten tämä toimii koodilla:
function rideBritishBoat() { let boatName = "Queen's Dab"; // local variable return `Driving ${boatName}`}function rideGermanBoat() { const status = rideBritishBoat(); return status;}rideGermanBoat();
yllä oleva esimerkki simuloi skenaariota, jossa saksalaiset ostivat veneen Britanniasta….(You could swap it which ever country you want…no täytyy taistella, miksi en maininnut toista maata. Nämä ovat vain maiden nimiä eivätkä JavaScript-kirjastoja 😛 ).
rideGermanBoat()
käyttää rideBritishBoat()
.
koska JavaScript käyttää leksikaalista ulottuvuutta, suoritettaessarideBritishBoat()
funktiota se menee sinne, mihin se luotiin ja saa muuttujan viitteen:boatName
. Joten leksikaalisella scopingilla aina kun rideBritishBoat()
suoritetaan, JavaScript menee funktion Scopen sisään etsimään tässä funktiossa käytettyjä muuttujia.
Huom: rideBritishBoat()
funktio on sen paikallinen soveltamisala ja globaali soveltamisala. rideGermanBoat()
ei kuulu rideBritishBoat()
funktion leksikaaliseen piiriin, koska rideBritishBoat()
ei luotu sen sisälle.
nyt muutetaan esimerkkiä vähän:
function rideBritishBoat() { return `Driving ${boatName}`; // Reference Error: boatName not defined}function rideGermanBoat() { let boatName = "Merkel's Dab"; const status = rideBritishBoat(); return status;}rideGermanBoat();
yllä oleva koodi epäonnistuu. rideBritishBoat()
funktiot eivät ole tarkkoja. Se epäonnistuu, kun yritetään käyttää boatName
palautuslausekkeessa.
miksi?
Tämä johtuu siitä, että JavaScript käyttää leksikaalista soveltamisalaa.
miten tämä toimii kohdatessaan boatName
muuttuja rideBritishBoat()
funktion sisällä, se etsii missä boatName
muuttuja on luotu sen Laajuusketjussa. Eli kaikki mahdolliset soveltamisala, joka on: paikallinen soveltamisala funktio, sitten se tarkistaa sen liitteenä Soveltamisala Tässä tapauksessa Maailmanlaajuinen soveltamisala.
näin JavaScript tarkistaa muuttujat. Se tarkistaa ensin paikallisen lohkon, jossa nykyistä muuttujaa käytetään, jotta tiedetään, onko se ilmoitettu siellä. Jos se ei ollut, niin se menee ylös sulkeva laajuus ja jatkaa, jos se ei löydä julistus kunnes se saavuttaa yläosassa ketjun, joka on maailmanlaajuinen laajuus
on olemassa yksi muu tyyppi Scoping kutsutaan ”dynaaminen Scoping”.
edellinen koodi toimisi kielellä, joka tukee dynaamista scopingia(esim.Lisp).
Tämä johtuu siitä, että dynaamisesti scopatussa ympäristössä muuttuja tarkistetaan ajon aikana. Tämä tarkoittaa sitä, että kun suoritat rideGermanBoat()
ja suoritus pääsee rideBritishBoat()
suoritusympäristö tarkistaa arvon boatName
, jossa koodi on parhaillaan käynnissä. Tällöin se löytää sen, joten ei ongelmaa ja koodi toimii odotetusti ja tulostaa Driving Merkel's Dab
.
leksikaalista soveltamisalaa kutsutaan myös staattiseksi Soveltamisalaksi, koska sen laajuus määräytyy käännösaikaan. Eli sen ympäristö / laajuus on kiinteä eikä voi vain muuttua. Toisin sanoen muuttujia voidaan kutsua vain sen koodilohkon sisältä, jossa se on ilmoitettu/luotu.
dynaamista ulottuvuutta kutsutaan dynaamiseksi, koska sen ympäristö (ulompi laajuus) voi muuttua. Toisin sanoen muuttujia voidaan kutsua sen lohkon ulkopuolelta, johon ne on luotu.
joten meillä voisi olla toinen funktio, joka käyttää rideBritishBoat()
nimeltään rideMauritianBoat()
:
function rideMauritianBoat() { let boatName = "Flying Dodo's Dab"; const status = rideBritishBoat(); return status;}rideMauritianBoat();
dynaamisesti scopatussa kielessä boatName
muuttuja sisällärideBritishBoat()
riippuu laajuudesta, jolla se suoritetaan. Koska voimme nähdä, että tämä soveltamisala voi muuttua, se on dynaaminen.
So inside rideBritishBoat()
, se kutsuu boatName
muuttuja rideMauritianBoat()
, joka on lohkonsa ulkopuolella.
se on dynaaminen Scoping ja Leksical Scoping on päinvastainen.
mutta muista, että JavaScript ei ole dynaamisesti scopattu. Tämä vain näyttää eron.
joten muuttujien leksikaaliset scoping-tarkistukset käännösaikaan (muuttujat on luotava ja ne ovat käytettävissä siinä laajuudessa / lohkossa, jota käytetään), kun taas dynaamiset scoping-tarkistukset muuttujille suoritusaikana (muuttujia ei välttämättä luoda scopiin koottaessa, mutta ne voivat olla läsnä funktion ollessa käynnissä).
Senior Devs be like: Dude!! JavaScript ei ole käännetty kieli!!
Please, let ’ s leave that talk for some other day. Yritä saada viesti, jonka välitän.
okei, mua vituttaa nyt. Tässä sinulle harjoitus.
Pikaharjoitus
mikä olisi tämän funktion ulostulo?
function rideBritishBoat() { let boatName = "Queen's Dab"; function rideWelshBoat() { boatName = "Welsh Royal Boat"; console.log(boatName) } rideWelshBoat();}rideBritishBoat()
Yhteenveto
tämän artikkelin tarkoituksena oli selittää leksikaalinen rajaus yksinkertaisella tavalla käyttäen peruskielioppia ja lyhyitä esimerkkejä. Jos huomasit joitakin sanoja on lihavoitu. Nämä ovat avainsanoja tämän käsitteen ymmärtämiseksi. Lisäksi minulla on paljon vaihtoehtoisia määritelmiä samoille käsitteille. Tämä tehtiin sinulle valita, mikä uppoaa helposti sinulle. Different strokes for different folks 😉
From what we ’ ve learned above we can say that:
- laajuus on ympäristö/alue, jossa jokin (muuttuja) on olemassa
- laajuus voi päästä käsiksi vanhempiinsa.
- pääkohteella ei ole suoraa pääsyä sisemmällä soveltamisalalla ilmoitettuihin muuttujiin.
- Leksikaalilla on tekemistä sen kanssa, missä muuttuja julistettiin / luotiin.
- leksikaalinen soveltamisala pakottaa etsimään muuttujia laajuudesta/lohkosta, joka on luotu / ilmoitettu, eikä ympäristöstä, jossa ne ovat käynnissä.
- dynaaminen soveltamisala on leksikaalisen soveltamisalan vastakohta.
- dynaaminen scoping tarkistaa muuttujat siitä, mistä ne ovat käynnissä.
Kiitos lukemisesta.
I ’ ll see you in the next post.