Ik zou proberen om lexicale scope uit te leggen in gewoon Engels. Wens me succes
tijdens het schrijven van een artikel over sluitingen en leven enkele dagen terug. Ik probeerde lexicale scope op een korte en eenvoudige manier uit te leggen. Ik merkte dat het artikel werd steeds groter en groter, dus ik besloot om te schrijven over lexicale scope afzonderlijk.
in dit artikel zou ik proberen de basisprincipes van lexical scope uit te leggen, wat het betekent en voorbeelden te geven om u te helpen begrijpen hoe het werkt in JavaScript. Geen modewoorden…Ik beloof het.
laten we eerst het woord “Lexical Scope”opsplitsen.
scope
We zullen het eerst hebben over de eenvoudige: scope.
In gewoon Engels kan scope betekenen:
- een grens
- een regio
- een omgeving
of een ander synoniem dat u kunt bedenken.
herinnert u zich dat u een tutorial hebt bekeken waarin de instructeur u vertelt dat een bepaald idee / onderwerp buiten het bereik van de video valt?
of wanneer een team van een andere afdeling aan een project werkt en je hen vertelt een functie toe te voegen waarvan je denkt dat het cool is en ze je vertellen: “dat valt buiten het bereik van dit project”.ik denk dat je de kern wel begrijpt. Scope is gewoon een regio waar iets in een bepaalde periode mag werken.
in de informatica kan dit een gebied betekenen waar bepaalde gegevens bestaan en toegankelijk zijn. Deze gegevens kunnen iets als een variabele zijn.
in een taal als JavaScript kunnen we een scope definiëren door een blok te maken met accolades: {...}
. We noemen dit blok Scope. Dit betekent dat variabelen die binnen dit blok worden gedeclareerd, alleen binnen deze regio kunnen worden benaderd. Deze regio omvat alles wat erin zit, inclusief andere kind / binnenblokken die in die regio zijn gecreëerd.
met andere woorden, deze regio is local
en de variabelen kunnen niet direct vanuit de buitenwereld worden benaderd. Dit zou een lokale scope kunnen worden genoemd.
variabelen die binnen functies worden gedeclareerd, bevinden zich in het lokale bereik van de functie.
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);
nu hebt u misschien eerder van Global Scope gehoord. Dat is een omgeving die niet ingesloten is in een blok. Elke code in uw Javascript omgeving heeft er toegang toe. Dit is de open JavaScript omgeving. Dus de code hieronder zou moeten werken.
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
Eén ding om op te merken:
een scope heeft toegang tot zijn bovenliggende scope, maar de bovenliggende scope heeft geen directe toegang tot variabelen die in een binnenscope zijn gedeclareerd.
De functie heeft toegang tot name
omdat de functie is gedeclareerd in het globale bereik en name
bestaat in het globale bereik. Als naam is gedeclareerd binnen de functie doSomething()
, dan kan de code in het globale bereik de waarde van name
niet direct wijzigen omdat name
lokaal is voor de functie.
ik geloof dat u goed begrijpt wat Scope betekent. Het betekent gewoon een regio of omgeving waar een variabele bestaat en kan worden benaderd of gewijzigd.
nu, laten we praten over “lexicaal”
lexicaal
om lexicaal te begrijpen, laten we eerst kijken naar het woord waarvan het is afgeleid van: Lexicon.Het Lexicon is afgeleid van het Latijnse woord: “lexis “wat”word”
betekent in gewoon Engels:
Lexicon betekent gewoon een woordenboek. In volgorde woorden, het betekent een woordenschat van de taal van een persoon. Het is als een boek waar de betekenis/definitie van woorden worden opgeslagen.
wanneer u de Betekenis van een woord wilt vinden, gaat u naar het lexicon.
je kijkt niet naar waar het woord wordt gebruikt en raadt wat het betekent en de inhoud of waarde ervan. Je gaat altijd naar het lexicon, waar het doel van het woord wordt gecreëerd en duidelijk gedefinieerd.
nu met die uitleg:
lexicaal betekent gewoon iets gerelateerd aan het lexicon. Met andere woorden, het betekent iets met betrekking tot woorden of woordenschat van de taal van een persoon. Iets met betrekking tot de creatie of definitie van woorden.
laten we het hebben over lexicale scope.
Lexical Scope
We hebben de Betekenis van de twee woorden in gewoon Engels gezien.
Met die kennis, laten we lexicale Scope definiëren in gewoon Engels:
Lexical Scope betekent eenvoudig dat de regio waarin een woord bestaat wordt bepaald door waar het is gedefinieerd of gemaakt.
andere definities zijn:
lexicaal bereik betekent dat de Betekenis/waarde van een woord alleen kan worden bepaald door de regio/omgeving waar het is gemaakt.
Lexical Scope betekent dat u de Betekenis van een woord niet direct uitbesteedt aan mensen uit een regio buiten de regio die het woord gebruikt. Dit komt omdat lexical de nadruk legt op de oorsprong op waar het is gemaakt/gedefinieerd.
Oké, ik zal een voorbeeld geven.
laten we het woord gebruiken: “Dance”.het woord “dans” werd gecreëerd/gedefinieerd in Groot-Brittannië. Het Britse volk kent de betekenis ervan. Dit woord bestaat in de scope waarin het werd gecreëerd: “Groot-Brittannië”. Wales is in Groot-Brittannië dus Wales heeft toegang tot dit woord (vergeet niet dat we al uitgelegd waarom hierboven). Zo kunnen de Welshe mensen de Betekenis van dit woord aanpassen aan hun lokale dialect. Dit komt omdat ze binnen het bereik van Groot-Brittannië vallen.
De Duitsers kunnen niet direct komen en de Betekenis van dit woord veranderen. Dit komt omdat het woord niet in Duitsland is gemaakt. Dus als de Duitsers het Engelse woord “dans” wilden gebruiken en dat woord is nog niet door Groot-Brittannië gemaakt, dan zou dat woord niet beschikbaar zijn, hoe hard ze ook proberen. Hierdoor zou niemand de werkelijke betekenis van dat woord in Duitsland kennen, omdat het woord niet bestaat in het Britse Lexicon. (Maak je geen zorgen als dit wartaal lijkt, Ik zal het later uitleggen met code)
aangezien we wetenschapsstudenten zijn en geen taalkundigen, laten we “word” vervangen door “variable”.
onze nieuwe definitie zou zijn:
Lexical Scope betekent eenvoudig dat de regio waarin een variabele bestaat wordt bepaald door waar deze is gedefinieerd of gemaakt.
Lexical Scope betekent dat de Betekenis/waarde van een variabele alleen kan worden bepaald door de regio/omgeving waar deze is gemaakt.
Lexical Scope betekent dat u de Betekenis van een variabele niet direct uitbesteedt om te coderen vanuit een gebied buiten(blok) dat de variabele gebruikt. Dit komt omdat lexical de nadruk legt op de oorsprong van waar de variabele is gemaakt/gedefinieerd.
dus wat lexical scope ons laat zien is dat een variabele alleen kan worden gebruikt in de scope waarin het werd gemaakt en niet waar het werd aangeroepen.
laten we eens kijken hoe dit werkt in code:
function rideBritishBoat() { let boatName = "Queen's Dab"; // local variable return `Driving ${boatName}`}function rideGermanBoat() { const status = rideBritishBoat(); return status;}rideGermanBoat();
het voorbeeld hierboven simuleert een scenario waarin de Duitsers een boot van Groot-Brittannië kochten….(Je zou kunnen ruilen welk land je ooit want…no ik moet vechten waarom ik het niet over een ander land heb. Dit zijn slechts landnamen en geen JavaScript-bibliotheken 😛 ).
De rideGermanBoat()
gebruikt de rideBritishBoat()
.
omdat JavaScript lexical scope gebruikt, gaat het bij het uitvoeren van de functie rideBritishBoat()
naar de plaats waar het is gemaakt en krijgt het de referentie van de variabele: boatName
. Dus met lexical scoping, wanneer rideBritishBoat()
wordt uitgevoerd, gaat JavaScript binnen de scope van de functie om te zoeken naar de variabelen die in deze functie worden gebruikt.
opmerking: de scope van de functie rideBritishBoat()
is de lokale scope en de Globale scope. De functie rideGermanBoat()
valt niet binnen het lexicale bereik van de functie rideBritishBoat()
omdat rideBritishBoat()
er niet in is aangemaakt.
laten we nu het voorbeeld een beetje veranderen:
function rideBritishBoat() { return `Driving ${boatName}`; // Reference Error: boatName not defined}function rideGermanBoat() { let boatName = "Merkel's Dab"; const status = rideBritishBoat(); return status;}rideGermanBoat();
bovenstaande code mislukt. De rideBritishBoat()
functies zijn niet nauwkeurig. Het mislukt bij het benaderen van boatName
in het return statement.
waarom?
Dit komt omdat JavaScript lexicale scope gebruikt.
hoe dit werkt is wanneer het boatName
variabele tegenkomt binnen de rideBritishBoat()
functie, het zoekt naar waar de boatName
variabele is gemaakt in zijn Scope keten. Dat wil zeggen, alle mogelijke scope van die functie die de: lokale Scope van de functie is, dan controleert het zijn omsluitende scope in dit geval de Globale Scope.
dus dat is hoe JavaScript controleert op variabelen. Het controleert eerst het lokale blok waarin de huidige variabele wordt gebruikt om te weten of het daar is gedeclareerd. Als dat niet het geval was, dan gaat het omhoog naar de enclosing scope en blijft doorgaan als het geen declaratie vindt totdat het de top van de keten bereikt die de Globale scope
is er een ander type Scoping genaamd “Dynamic Scoping”.
de vorige code zou werken in een taal die dynamische scoping ondersteunt(bijv. Lisp).
Dit komt omdat in een dynamische omgeving, de variabele wordt gecontroleerd tijdens runtime. Wat betekent is dat wanneer u rideGermanBoat()
uitvoert en het uitvoeren naar rideBritishBoat()
de runtime-omgeving controleert op de waarde van boatName
waar de code momenteel draait. In dit geval vindt het het, dus geen probleem en de code werkt naar verwachting en print Driving Merkel's Dab
.
lexicale Scope wordt ook statische Scope genoemd omdat de scope tijdens het compileren wordt bepaald. Wat betekent dat de omgeving / scope is vast en kan niet zomaar veranderen. Met andere woorden, variabelen kunnen alleen worden aangeroepen vanuit het blok code waarin het werd gedeclareerd/aangemaakt.
dynamisch bereik wordt dynamisch genoemd omdat zijn omgeving (outer scope) kan veranderen. Met andere woorden, variabelen kunnen worden aangeroepen van buiten het blok dat ze zijn gemaakt.
dus we zouden een andere functie kunnen hebben die de rideBritishBoat()
gebruikt genaamd rideMauritianBoat()
:
function rideMauritianBoat() { let boatName = "Flying Dodo's Dab"; const status = rideBritishBoat(); return status;}rideMauritianBoat();
in een dynamische taal kunt u zien dat de waarde van boatName
variabele binnen rideBritishBoat()
afhankelijk is van de scope waarin het wordt uitgevoerd. Aangezien we kunnen zien dat dit bereik kan veranderen, is het dus dynamisch.
dus binnen rideBritishBoat()
roept het de boatName
variabele van rideMauritianBoat()
aan die buiten het blokbereik valt.
dat is dynamische Scoping en lexicale Scoping is het tegenovergestelde.
maar vergeet niet, JavaScript is niet dynamisch scoped. Dit is om je het verschil te laten zien.
dus lexical scoping controleert op variabelen tijdens het compileren (variabelen moeten worden aangemaakt en toegankelijk zijn in de scope/block die wordt gebruikt) terwijl dynamische scoping controleert op variabelen tijdens het uitvoeren (variabelen kunnen niet worden aangemaakt in de scope tijdens het compileren, maar kunnen aanwezig zijn wanneer de functie wordt uitgevoerd).
Senior Devs zijn als: Dude!! JavaScript is geen gecompileerde taal!!
alsjeblieft, laten we dat gesprek voor een andere dag laten. Probeer de boodschap te krijgen die ik doorgeef.oké, ik ben nu kwaad. Hier is een oefening voor je.
snelle oefening
Wat zou de output van deze functie zijn?
function rideBritishBoat() { let boatName = "Queen's Dab"; function rideWelshBoat() { boatName = "Welsh Royal Boat"; console.log(boatName) } rideWelshBoat();}rideBritishBoat()
samenvatting
Het doel van dit artikel was om lexicale scoping op een eenvoudige manier uit te leggen met behulp van basis grammatica en korte voorbeelden. Als je merkt dat sommige woorden vet zijn. Dat zijn de sleutelwoorden om dit concept te begrijpen. Plus, Ik heb veel alternatieve definities van dezelfde concepten. Dit werd gedaan voor u om te selecteren welke zinkt gemakkelijk voor u. Verschillende slagen voor verschillende mensen 😉
van wat we hierboven geleerd hebben kunnen we zeggen dat:
- een scope is een omgeving / regio waarin iets (een variabele) bestaat
- een scope heeft toegang tot zijn ouders.
- een bovenliggende scope heeft geen directe toegang tot variabelen die zijn gedeclareerd in een interne scope.
- Lexical heeft te maken met waar een variabele is gedeclareerd / aangemaakt.
- Lexical scope dwingt het vinden van variabelen af uit de scope/block waarin ze zijn gemaakt/gedeclareerd en niet de omgeving waarin ze draaien.
- dynamisch bereik is het tegenovergestelde van lexicaal bereik.
- dynamische scoping controleert de variabelen waar ze worden uitgevoerd.
Bedankt voor het lezen.ik zie je in de volgende post.