Jeg vil forsøge at forklare leksikalsk omfang på almindeligt engelsk. Ønsk mig held og lykke
mens du skriver en artikel om lukninger og IIFE nogle dage tilbage. Jeg forsøgte at forklare leksikalsk omfang på en kort og enkel måde. Jeg bemærkede, at artiklen blev større og større, så jeg besluttede bare at skrive om leksikalsk omfang separat.
i denne artikel vil jeg forsøge at forklare det grundlæggende i leksikalsk omfang, hvad det betyder og give eksempler for at hjælpe dig med at forstå, hvordan det fungerer i JavaScript. Ingen ord…Det lover jeg.
lad os først nedbryde ordet “leksikalsk omfang”.
scope
vi snakker først om den nemme: scope.
på almindeligt engelsk kan omfang betyde:
- en grænse
- en region
- et miljø
eller ethvert andet synonym, du kunne tænke på.
kan du huske at se en tutorial, hvor instruktøren fortæller dig en bestemt ide/emne er uden for videoens omfang?
eller når et team fra en anden afdeling arbejder på et projekt, og du beder dem om at tilføje en funktion, som du synes er cool, og de fortæller dig: “det er uden for rammerne af dette projekt”.
Jeg tror, du får kernen. Scope er simpelthen en region, hvor noget er tilladt at operere på en given periode.
i datalogi kan dette betyde en region, hvor der findes nogle data og kan fås adgang til. Disse data kan være noget som en variabel.
på et sprog som JavaScript kunne vi definere et omfang ved at oprette en blok ved hjælp af krøllede seler: {...}
. Vi kalder dette Blokområde. Dette betyder, at variabler, der er erklæret inde i denne blok, kun kan fås inden for denne region. Denne region dækker alt inde i det, herunder andre barn/indre blokke skabt inden for denne region.
med andre ord er denne region local
og dens variabler kan ikke fås direkte fra omverdenen. Så dette kunne kaldes et lokalt omfang.
variabler, der er erklæret inden for funktioner, er i funktionens lokale omfang.
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 har du måske hørt om Global Scope før. Nå, det er et miljø, der ikke er lukket i en blok. Hver kode i dit Javascript-miljø har adgang til det. Dette er det åbne JavaScript-miljø. Så koden nedenfor skal fungere.
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
en ting at bemærke:
et omfang har adgang til dets overordnede omfang, men det overordnede omfang har ikke direkte adgang til variabler, der er erklæret i et indre omfang.
funktionen har adgang tilname
fordi funktionen er erklæret i det globale omfang ogname
findes i det globale omfang. Hvis navnet blev erklæret inde i doSomething()
– funktionen, kan koden i det globale omfang ikke ændre værdien af name
direkte fordi name
er lokal for funktionen.
Jeg tror, du har en god forståelse af, hvad omfang betyder. Det betyder simpelthen en region eller et miljø, hvor en variabel findes og kan tilgås eller ændres.
lad os nu tale om “leksikalsk”
leksikalsk
for at forstå leksikalsk, lad os først se på det ord, hvorfra det stammer fra: leksikon.
leksikon stammer fra det latinske ord: “leksis “hvilket betyder”ord”
på almindeligt engelsk:
leksikon betyder simpelthen en ordbog. For ord betyder det et ordforråd af en persons sprog. Det er som en bog, hvor betydningen/definitionen af ord er gemt.
Når du vil finde betydningen af et ord, går du til leksikonet.
du ser ikke på, hvor ordet bruges, og gætter hvad det betyder og dets indhold eller værdi. Du går altid leksikonet, hvor ordets formål er skabt og klart defineret.
nu med den forklaring:
leksikalsk betyder simpelthen noget relateret til leksikonet. Med andre ord betyder det noget relateret til ord eller ordforråd på en persons sprog. Noget relateret til oprettelse eller definition af ord.
lad os tale om leksikalsk omfang.
leksikalsk omfang
Vi har set betydningen af de to ord på almindeligt engelsk.
med den viden, lad os definere leksikalsk omfang på almindeligt engelsk:
leksikalsk omfang betyder simpelthen, at den region, hvor et ord eksisterer, bestemmes af, hvor det blev defineret eller oprettet.
andre definitioner ville være:
leksikalt omfang betyder, at betydningen/værdien af et ord kun kan bestemmes af det område/miljø, hvor det blev oprettet.leksikalsk omfang betyder, at du ikke direkte outsourcer betydningen af et ord til personer fra en ekstern region, der bruger ordet. Dette skyldes, at leksikalsk lægger vægt på oprindelsen på, hvor den blev oprettet/defineret.
Okay, jeg vil give et eksempel.
Lad os bruge ordet:”Dans”.
ordet “dans” blev oprettet/defineret i Storbritannien. Det britiske folk kender dens betydning. Dette ord findes i det omfang, hvori det blev oprettet: “Storbritannien”. Danmark er i Storbritannien, så Danmark har adgang til dette ord (Husk, at vi allerede har forklaret hvorfor ovenfor). Så folk kan opdatere betydningen af dette ord, der passer til deres lokale dialekt. Dette skyldes, at de er inden for rammerne af Storbritannien.
tyskerne kan ikke direkte komme og ændre betydningen af dette ord. Dette skyldes, at ordet ikke blev oprettet i Tyskland. Så hvis tyskerne ønskede at bruge det engelske ord: “dans”, og dette ord endnu ikke er skabt af Storbritannien, ville dette ord ikke være tilgængeligt, uanset hvor hårdt de prøver. Dette ville ikke få nogen til at kende den egentlige betydning af dette ord i Tyskland, fordi ordet ikke findes i Det Britiske leksikon. (Bare rolig, hvis dette virker gibberish, forklarer jeg med kode senere)
da vi er videnskabsstuderende og ikke lingvister, lad os erstatte “ord” med “variabel”.
vores nye definition ville være:
leksikalsk omfang betyder simpelthen, at den region, hvor en variabel findes, bestemmes af, hvor den blev defineret eller oprettet.leksikalsk omfang betyder, at betydningen/værdien af en variabel kun kan bestemmes af det område/miljø, hvor den blev oprettet.leksikalsk omfang betyder, at du ikke direkte outsourcer betydningen af en variabel til kode fra en ekstern region(blok), der bruger variablen. Dette skyldes, at leksikalsk lægger vægt på oprindelsen på, hvor variablen blev oprettet/defineret.
så hvad leksikalsk omfang viser os er, at en variabel kun kan bruges i det omfang, hvori den blev oprettet, og ikke hvor den blev kaldt.
lad os se, hvordan dette fungerer i kode:
function rideBritishBoat() { let boatName = "Queen's Dab"; // local variable return `Driving ${boatName}`}function rideGermanBoat() { const status = rideBritishBoat(); return status;}rideGermanBoat();
eksemplet ovenfor simulerer et scenarie, hvor tyskerne købte en båd fra Storbritannien….(Du kan bytte det, som nogensinde land du want…no har brug for at kæmpe for, hvorfor jeg ikke nævnte et andet land. Disse er blot Land navne og ikke JavaScript-biblioteker).rideGermanBoat()
bruger rideBritishBoat()
.
da JavaScript bruger leksikalsk omfang, når du udfører rideBritishBoat()
– funktionen, går den til, hvor den blev oprettet og får referencen til variablen: boatName
. Så med leksikalsk scoping, nårrideBritishBoat()
udføres, går JavaScript inden for funktionens rækkevidde for at se efter de variabler, der bruges i denne funktion.
Bemærk: omfanget af rideBritishBoat()
funktionen er dens lokale omfang og det globale omfang. rideGermanBoat()
er ikke i det leksikale omfang af rideBritishBoat()
funktionen fordi rideBritishBoat()
blev ikke oprettet inde i den.
lad os nu ændre eksemplet lidt:
function rideBritishBoat() { return `Driving ${boatName}`; // Reference Error: boatName not defined}function rideGermanBoat() { let boatName = "Merkel's Dab"; const status = rideBritishBoat(); return status;}rideGermanBoat();
ovenstående kode fejler. FunktionernerideBritishBoat()
er ikke præcise. Det mislykkes, når du prøver at få adgang til boatName
i returopgørelsen.
hvorfor?
Dette skyldes, at JavaScript bruger leksikalsk rækkevidde.
Sådan fungerer det, når det støder på boatName
variabel inde i rideBritishBoat()
funktion, det ser efter, hvor boatName
variablen blev oprettet i dens Omfangskæde. Det vil sige alt muligt omfang af den funktion, der er: funktionens lokale omfang, så kontrollerer det dets omsluttende omfang i dette tilfælde Det globale omfang.
så det er sådan JavaScript kontrollerer for variabler. Den kontrollerer først den lokale blok, hvor den aktuelle variabel bruges til at vide, om den blev erklæret der. Hvis det ikke var det, går det op til det omsluttende omfang og fortsætter, hvis det ikke finder en erklæring, før den når toppen af kæden, som er det globale omfang
Der er en anden type Scoping kaldet “dynamisk Scoping”.
Den Tidligere kode ville arbejde på et sprog, der understøtter dynamisk scoping(f.eks Lisp).
Dette skyldes, at variablen i et dynamisk scoped miljø kontrolleres ved kørselstid. Det betyder, at når du udfører rideGermanBoat()
og udførelse kommer til rideBritishBoat()
runtime-miljøet kontrollerer værdien af boatName
hvor koden kører i øjeblikket. I dette tilfælde finder den det, så ikke noget problem, og koden fungerer på forventet og udskriver Driving Merkel's Dab
.
leksikalsk omfang kaldes også statisk omfang, fordi dens omfanget bestemmes ved kompileringstid. Betydning det miljø / omfang er fast og kan ikke bare ændre. Med andre ord kan variabler kun kaldes inden for den kodeblok, hvori den blev erklæret/oprettet.
dynamisk omfang kaldes dynamisk, fordi dets miljø (ydre omfang) kan ændre sig. Med andre ord kan variabler kaldes uden for blokken, som de oprettes.
så vi kunne have en anden funktion, der bruger rideBritishBoat()
kaldet rideMauritianBoat()
:
function rideMauritianBoat() { let boatName = "Flying Dodo's Dab"; const status = rideBritishBoat(); return status;}rideMauritianBoat();
i et dynamisk scoped sprog kan du se værdien afboatName
variabel inderideBritishBoat()
er afhængig af omfanget, hvor det udføres. Da vi kan se, at dette omfang kan ændre sig, er det derfor dynamisk.
så inde rideBritishBoat()
, det kalderboatName
variabel afrideMauritianBoat()
som er uden for dens blokområde.
det er dynamisk Scoping og leksikalsk Scoping er det modsatte.
men husk, JavaScript er ikke dynamisk scoped. Dette er bare for at vise dig forskellen.
så leksikalsk scoping kontrollerer for variabler ved kompileringstid (variabler skal oprettes og være tilgængelige i det omfang / blok, det bruges), mens dynamisk scoping kontrollerer for variabler ved kørselstid (variabler oprettes muligvis ikke i omfanget ved kompilering, men kan være til stede, når funktionen kører).
Senior Devs være ligesom: Dude!! JavaScript er ikke et kompileret sprog!!
Lad os tage den snak en anden dag. Bare prøv at få den besked, jeg sender.
Jeg er pissesur lige nu. Her er en øvelse for dig.
hurtig øvelse
Hvad ville udgangen af denne funktion være?
function rideBritishBoat() { let boatName = "Queen's Dab"; function rideWelshBoat() { boatName = "Welsh Royal Boat"; console.log(boatName) } rideWelshBoat();}rideBritishBoat()
Resume
formålet med denne artikel var at forklare leksikalsk scoping på en enkel måde ved hjælp af grundlæggende grammatik og korte eksempler. Hvis du har bemærket, er nogle ord med fed skrift. Det er nøgleordene for at forstå dette koncept. Plus, jeg har masser af alternative definitioner af de samme begreber. Dette blev gjort for dig at vælge, hvilken der synker let ind for dig. Forskellige slag for forskellige folk, der er
fra det, vi har lært ovenfor, kan vi sige det:
- et omfang er et miljø/område, hvor der findes noget (en variabel)
- et omfang kan få adgang til dets forældre.
- et overordnet omfang har ikke direkte adgang til variabler, der er erklæret i et indre omfang.
- leksikalsk har gøre med, hvor en variabel blev erklæret/oprettet.
- leksikalsk rækkevidde håndhæver at finde variabler fra omfanget/blokken, de blev oprettet / erklæret, og ikke det miljø, de kører i.
- dynamisk omfang er det modsatte af leksikalsk omfang.
- dynamisk scoping kontrollerer variablerne fra hvor de kører.
tak for læsning.
Vi ses i næste indlæg.