Ich würde versuchen, den lexikalischen Umfang in einfachem Englisch zu erklären. Wünsche mir Glück
Beim Schreiben eines Artikels über Verschlüsse und ich bin vor ein paar Tagen gestorben. Ich habe versucht, den lexikalischen Umfang kurz und einfach zu erklären. Ich bemerkte, dass der Artikel immer größer wurde, also beschloss ich, separat über den lexikalischen Umfang zu schreiben.
In diesem Artikel würde ich versuchen, die Grundlagen des lexikalischen Bereichs zu erklären, was es bedeutet und Beispiele zu geben, die Ihnen helfen zu verstehen, wie es in JavaScript funktioniert. Keine Schlagworte…Ich verspreche es.
Lassen Sie uns zunächst das Wort „Lexikalischer Umfang“ aufschlüsseln.
Umfang
Wir werden zuerst über den einfachen sprechen: Umfang.
Im Klartext kann scope bedeuten:
- Eine Grenze
- Eine Region
- Eine Umgebung
Oder ein anderes Synonym, das Sie sich vorstellen können.
Erinnerst du dich an ein Tutorial, in dem der Kursleiter dir sagt, dass eine bestimmte Idee / ein bestimmtes Thema den Rahmen des Videos sprengt?Oder wenn ein Team aus einer anderen Abteilung an einem Projekt arbeitet und Sie ihnen sagen, Sie sollen eine Funktion hinzufügen, die Sie für cool halten, und sie sagen Ihnen: „Das geht über den Rahmen dieses Projekts hinaus“.
Nun, ich denke, Sie bekommen den Kern. Scope ist einfach eine Region, in der etwas zu einem bestimmten Zeitpunkt funktionieren darf.
In der Informatik könnte dies eine Region bedeuten, in der einige Daten vorhanden sind und auf die zugegriffen werden kann. Diese Daten könnten so etwas wie eine Variable sein.
In einer Sprache wie JavaScript könnten wir einen Bereich definieren, indem wir einen Block mit geschweiften Klammern erstellen: {...}
. Wir nennen diesen Block Scope. Dies bedeutet, dass innerhalb dieses Blocks deklarierte Variablen nur innerhalb dieser Region aufgerufen werden können. Diese Region deckt alles ab, einschließlich anderer untergeordneter / innerer Blöcke, die in dieser Region erstellt wurden.
Mit anderen Worten, diese Region ist local
und auf ihre Variablen kann nicht direkt von außen zugegriffen werden. Dies könnte also als lokaler Bereich bezeichnet werden.
Innerhalb von Funktionen deklarierte Variablen befinden sich im lokalen Bereich der Funktion.
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);
Vielleicht haben Sie schon einmal von Global Scope gehört. Nun, das ist eine Umgebung, die nicht in einem Block eingeschlossen ist. Jeder Code in Ihrer Javascript-Umgebung hat Zugriff darauf. Dies ist die offene JavaScript-Umgebung. Der folgende Code sollte also funktionieren.
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
Eine Sache zu beachten:
Ein Bereich hat Zugriff auf seinen übergeordneten Bereich, aber der übergeordnete Bereich hat keinen direkten Zugriff auf Variablen, die in einem inneren Bereich deklariert sind.
Die Funktion hat Zugriff auf name
, da die Funktion im globalen Bereich deklariert ist und name
im globalen Bereich vorhanden ist. Wenn name innerhalb der Funktion doSomething()
deklariert wurde, kann der Code im globalen Bereich den Wert von name
nicht direkt ändern, da name
lokal für die Funktion ist.
Ich glaube, Sie haben ein gutes Verständnis davon, was Umfang bedeutet. Es bedeutet einfach nur eine Region oder Umgebung, in der eine Variable existiert und auf die zugegriffen oder geändert werden kann.
Lassen Sie uns nun über „Lexikalisch“ sprechen
Lexikalisch
Um lexikalisch zu verstehen, schauen wir uns zuerst das Wort an, von dem es abgeleitet ist: Lexikon.
Lexikon wurde aus dem lateinischen Wort abgeleitet: „lexis“ bedeutet „Wort“
Im Klartext:
Lexikon bedeutet einfach ein Wörterbuch. In Ordnungswörtern bedeutet dies ein Vokabular der Sprache einer Person. Es ist wie ein Buch, in dem die Bedeutung / Definition von Wörtern gespeichert ist.
Wann immer Sie die Bedeutung eines Wortes finden möchten, gehen Sie zum Lexikon.
Sie schauen nicht, wo das Wort verwendet wird und erraten, was es bedeutet und seinen Inhalt oder Wert. Sie gehen immer zum Lexikon, wo der Zweck des Wortes erstellt und klar definiert ist.
Jetzt mit dieser Erklärung:
Lexikalisch bedeutet einfach etwas, das mit dem Lexikon zusammenhängt. Mit anderen Worten, es bedeutet etwas, das mit Wörtern oder Vokabeln der Sprache einer Person zusammenhängt. Etwas, das mit der Erstellung oder Definition von Wörtern zusammenhängt.
Lassen Sie uns über den lexikalischen Umfang sprechen.
Lexikalischer Umfang
Wir haben die Bedeutung der beiden Wörter in einfachem Englisch gesehen.
Mit diesem Wissen definieren wir den lexikalischen Umfang in einfachem Englisch:
Lexikalischer Umfang bedeutet einfach, dass die Region, in der ein Wort existiert, dadurch bestimmt wird, wo es definiert oder erstellt wurde.
Andere Definitionen wären:
Lexikalischer Umfang bedeutet, dass die Bedeutung / der Wert eines Wortes nur durch die Region / Umgebung bestimmt werden kann, in der es erstellt wurde.
Lexikalischer Umfang bedeutet, dass Sie die Bedeutung eines Wortes nicht direkt an Personen aus einer externen Region auslagern, die das Wort verwenden. Dies liegt daran, dass lexical den Schwerpunkt auf den Ursprung legt, an dem er erstellt / definiert wurde.
Okay, ich werde ein Beispiel geben.
Verwenden wir das Wort: „Tanz“.
Das Wort „Tanz“ wurde in Großbritannien geschaffen / definiert. Das britische Volk kennt seine Bedeutung. Dieses Wort existiert in dem Umfang, in dem es geschaffen wurde: „Großbritannien“. Wales ist in Großbritannien, daher hat Wales Zugang zu diesem Wort (denken Sie daran, dass wir oben bereits erklärt haben, warum). So können die Waliser die Bedeutung dieses Wortes an ihren lokalen Dialekt anpassen. Dies liegt daran, dass sie innerhalb des Geltungsbereichs von Großbritannien liegen.
Die Deutschen können nicht direkt kommen und die Bedeutung dieses Wortes ändern. Dies liegt daran, dass das Wort nicht in Deutschland geschaffen wurde. Wenn die Deutschen also das englische Wort „Tanz“ verwenden wollten und dieses Wort noch nicht von Großbritannien geschaffen wurde, wäre dieses Wort nicht verfügbar, egal wie sehr sie es versuchen. Dies würde dazu führen, dass niemand die tatsächliche Bedeutung dieses Wortes in Deutschland kennt, da das Wort im britischen Lexikon nicht existiert. (Mach dir keine Sorgen, wenn das Kauderwelsch erscheint, ich werde es später mit Code erklären)
Da wir Studenten der Naturwissenschaften und keine Linguisten sind, ersetzen wir „Wort“ durch „Variable“.
Unsere neue Definition wäre:
Lexikalischer Bereich bedeutet einfach, dass die Region, in der eine Variable existiert, dadurch bestimmt wird, wo sie definiert oder erstellt wurde.
Lexikalischer Umfang bedeutet, dass die Bedeutung / der Wert einer Variablen nur durch die Region / Umgebung bestimmt werden kann, in der sie erstellt wurde.
Lexikalischer Bereich bedeutet, dass Sie die Bedeutung einer Variablen nicht direkt an Code aus einem externen Bereich (Block) auslagern, der die Variable verwendet. Dies liegt daran, dass lexical den Schwerpunkt auf den Ursprung legt, an dem die Variable erstellt / definiert wurde.
Der lexikalische Bereich zeigt uns also, dass eine Variable nur in dem Bereich verwendet werden kann, in dem sie erstellt wurde, und nicht dort, wo sie aufgerufen wurde.
Mal sehen, wie das im Code funktioniert:
function rideBritishBoat() { let boatName = "Queen's Dab"; // local variable return `Driving ${boatName}`}function rideGermanBoat() { const status = rideBritishBoat(); return status;}rideGermanBoat();
Das obige Beispiel simuliert ein Szenario, in dem die Deutschen ein Boot aus Großbritannien gekauft haben….(Sie könnten es tauschen, welches Land Sie auch immer haben want…no muss kämpfen, warum ich kein anderes Land erwähnt habe. Dies sind nur Ländernamen und keine JavaScript-Bibliotheken 😛 ).
Die rideGermanBoat()
verwendet die rideBritishBoat()
.
Da JavaScript den lexikalischen Bereich verwendet, geht es beim Ausführen der Funktion rideBritishBoat()
dorthin, wo es erstellt wurde, und erhält die Referenz der Variablen: boatName
. Wenn also beim lexikalischen Scoping rideBritishBoat()
ausgeführt wird, geht JavaScript in den Bereich der Funktion, um nach den in dieser Funktion verwendeten Variablen zu suchen.
Hinweis: Der Gültigkeitsbereich der rideBritishBoat()
-Funktion ist der lokale Gültigkeitsbereich und der globale Gültigkeitsbereich. Die rideGermanBoat()
befindet sich nicht im lexikalischen Bereich der rideBritishBoat()
Funktion, da rideBritishBoat()
nicht darin erstellt wurde.
Lassen Sie uns nun das Beispiel ein wenig ändern:
function rideBritishBoat() { return `Driving ${boatName}`; // Reference Error: boatName not defined}function rideGermanBoat() { let boatName = "Merkel's Dab"; const status = rideBritishBoat(); return status;}rideGermanBoat();
Der obige Code schlägt fehl. Die rideBritishBoat()
Funktionen sind nicht präzise. Es schlägt fehl, wenn versucht wird, auf boatName
in der return-Anweisung zuzugreifen.
Warum?
Dies liegt daran, dass JavaScript den lexikalischen Bereich verwendet.
Wie das funktioniert, wenn es auf boatName
Variable innerhalb der rideBritishBoat()
Funktion trifft, sucht es, wo die boatName
Variable in ihrer Scope-Kette erstellt wurde. Das heißt, alle möglichen Umfang dieser Funktion, die die ist: Lokaler Bereich der Funktion, dann überprüft es seinen umschließenden Bereich in diesem Fall der globale Bereich.
So sucht JavaScript nach Variablen. Es überprüft zunächst den lokalen Block, in dem die aktuelle Variable verwendet wird, um festzustellen, ob sie dort deklariert wurde. Wenn nicht, dann geht es bis zum umschließenden Bereich und geht weiter, wenn es keine Deklaration findet, bis es die Spitze der Kette erreicht, die der globale Bereich ist
Es gibt eine andere Art von Scoping namens „Dynamic Scoping“.
Der vorherige Code würde in einer Sprache funktionieren, die dynamisches Scoping unterstützt (z. B. Lisp).
Dies liegt daran, dass in einer Umgebung mit dynamischem Gültigkeitsbereich die Variable zur Laufzeit überprüft wird. Was bedeutet, ist, dass, wenn Sie rideGermanBoat()
ausführen und die Ausführung zu rideBritishBoat()
die Laufzeitumgebung nach dem Wert von boatName
wo der Code gerade ausgeführt wird. In diesem Fall findet es es, also kein Problem und der Code funktioniert wie erwartet und druckt Driving Merkel's Dab
.
Der lexikalische Bereich wird auch als statischer Bereich bezeichnet, da der Bereich zur Kompilierungszeit festgelegt wird. Das heißt, die Umgebung / der Umfang ist festgelegt und kann nicht einfach geändert werden. Mit anderen Worten, Variablen können nur innerhalb des Codeblocks aufgerufen werden, in dem sie deklariert / erstellt wurden.
Dynamischer Bereich wird dynamisch genannt, weil sich seine Umgebung (äußerer Bereich) ändern kann. Mit anderen Worten, Variablen können von außerhalb des Blocks aufgerufen werden, in dem sie erstellt werden.
Wir könnten also eine andere Funktion haben, die die rideBritishBoat()
rideMauritianBoat()
:
function rideMauritianBoat() { let boatName = "Flying Dodo's Dab"; const status = rideBritishBoat(); return status;}rideMauritianBoat();
In einer dynamisch definierten Sprache können Sie den Wert von boatName
Variable innerhalb rideBritishBoat()
ist abhängig von dem Bereich, in dem es ausgeführt wird. Wie wir sehen können, kann sich dieser Bereich ändern, daher ist er dynamisch.
Innerhalb von rideBritishBoat()
wird also die boatName
Variable von rideMauritianBoat()
aufgerufen, die sich außerhalb ihres Blockbereichs befindet.
Das ist dynamisches Scoping und lexikalisches Scoping ist das Gegenteil.
Aber denken Sie daran, JavaScript ist nicht dynamisch begrenzt. Dies ist nur, um Ihnen den Unterschied zu zeigen.
Lexikalisches Scoping prüft also zur Kompilierungszeit auf Variablen (Variablen müssen in dem Bereich / Block, in dem sie verwendet werden, erstellt und zugänglich sein), während dynamisches Scoping zur Laufzeit auf Variablen prüft (Variablen werden beim Kompilieren möglicherweise nicht im Bereich erstellt, können aber vorhanden sein, wenn die Funktion ausgeführt wird).
Ältere Entwickler seien wie: Alter!! JavaScript ist keine kompilierte Sprache!!
Bitte, lassen wir das Gespräch für einen anderen Tag. Versuchen Sie einfach, die Nachricht zu erhalten, die ich weitergebe.
Okay, ich bin gerade sauer. Hier ist eine Übung für Sie.
Schnelle Übung
Was wäre die Ausgabe dieser Funktion?
function rideBritishBoat() { let boatName = "Queen's Dab"; function rideWelshBoat() { boatName = "Welsh Royal Boat"; console.log(boatName) } rideWelshBoat();}rideBritishBoat()
Zusammenfassung
Ziel dieses Artikels war es, das lexikalische Scoping auf einfache Weise anhand grundlegender Grammatik und kurzer Beispiele zu erklären. Wenn Sie bemerkt haben, sind einige Wörter fett gedruckt. Das sind die Schlüsselwörter, um dieses Konzept zu verstehen. Außerdem habe ich viele alternative Definitionen der gleichen Konzepte. Dies wurde getan, damit Sie auswählen können, welches für Sie leicht einsinkt. Verschiedene Striche für verschiedene Leute 😉
Von dem, was wir oben gelernt haben, können wir sagen, dass:
- Ein Bereich ist eine Umgebung/Region, in der etwas (eine Variable) existiert
- Ein Bereich kann auf seine Eltern zugreifen.
- Ein übergeordneter Bereich hat keinen direkten Zugriff auf Variablen, die in einem inneren Bereich deklariert sind.
- Lexikalisch hat damit zu tun, wo eine Variable deklariert / erstellt wurde.
- Der lexikalische Bereich erzwingt das Auffinden von Variablen aus dem Bereich / Block, in dem sie erstellt / deklariert wurden, und nicht aus der Umgebung, in der sie ausgeführt werden.
- Dynamischer Bereich ist das Gegenteil von lexikalischem Bereich.
- Dynamisches Scoping überprüft die Variablen von wo aus sie ausgeführt werden.
Danke fürs Lesen.
Wir sehen uns im nächsten Post.