Die vorherigen Wörter
Meistens ist der Hauptgrund, warum wir mit dem Umfang verwirrt sind, dass wir nicht unterscheiden können, ob in der verschachtelten Reihenfolge der Funktionspositionen oder in der Reihenfolge der Funktionsaufrufe variable Suchanfragen durchgeführt werden sollten. In Verbindung mit der Interferenz dieses Mechanismus ist die variable Suche sehr anfällig für Fehler. Dies wird tatsächlich durch zwei Bereiche Arbeitsmodelle verursacht. Der Umfang ist in einen lexikalischen Bereich und den dynamischen Bereich unterteilt. Durch die Unterscheidung dieser beiden Umfangsmodelle können Sie ein klares Verständnis des variablen Suchprozesses haben. Dieser Artikel ist das zweite Kapitel der JavaScript Scope -Reihe - lexikalischer Bereich und dynamischer Umfang
Lexikalischer Bereich
Wie im ersten Artikel erwähnt, wird die erste Arbeitsstufe des Compilers als Partizip bezeichnet, das eine Zeichenfolge zerlegt, die aus Zeichen in lexikalische Einheiten zusammenhängt. Dieses Konzept ist die Grundlage für das Verständnis des lexikalischen Umfangs
Einfach ausgedrückt, das lexikalische Bereich definiert den Bereich in der lexikalischen Stufe, das durch das Schreiben des Codes bestimmt wird, wo die Variablen und der Blockbereich geschrieben werden. Daher bleibt der Bereich unverändert, wenn der lexikalische Analysator den Code verarbeitet.
Beziehung
Egal wo die Funktion aufgerufen wird und egal wie sie genannt wird, ihr lexikalischer Bereich wird nur durch die Position bestimmt, in der die Funktion deklariert wird.
Funktion foo (a) {var b = a * 2; Funktionsleiste (c) {console.log (a, b, c);} bange (b * 3);} foo (2); // 2 4 12In diesem Beispiel gibt es drei verschachtelte Bereiche. Betrachten Sie sie als mehrere Blasen, die Schritt für Schritt enthalten sind
Zielfernrohrblasen werden dadurch bestimmt, dass ihr entsprechender Bereichsblockcode geschrieben wird und Schritt für Schritt enthalten ist.
Bubble 1 enthält den gesamten globalen Umfang mit nur einer Kennung: Foo
Bubble 2 enthält den von Foo erstellten Bereich, der drei Kennungen hat: a, bar und b
Bubble 3 enthält den von Balken erstellten Bereich mit nur einer Kennung: C.
Finden
Die Struktur von Scoped Blasen und ihre Positionsbeziehungen liefern dem Motor mit ausreichenden Positionsinformationen, die der Motor verwendet, um die Position des Kennungsmittels zu ermitteln.
Im Code -Snippet führt die Engine die Erklärung der Konsole aus. Es beginnt zuerst mit dem innersten Bereich, dh dem Umfang der Stange (...) Funktion. Der Motor kann hier keine finden, daher wird er zum vorherigen Level gehen, um weiter im Bereich des verschachtelten Foo (...) zu suchen. A wird hier gefunden, sodass der Motor diese Referenz verwendet. Das gleiche gilt für b. Und für C fand der Motor es in Bar (...)
[Anmerkung] Die lexikalische Scope-Suche wird nur nach Identifikatoren der ersten Ebene suchen. Wenn der Code verweist, dass foo.bar.baz, versucht die lexikalische Scope -Suche nur, Foo -Kennungen zu finden. Nachdem diese Variablen gefunden wurden, übernehmen die Regeln für den Zugriff auf Zugriff auf Bar- bzw. BAZ -Attribute den Zugriffsregeln
foo = {bar: {baz: 1}}; console.log (foo.bar.baz); // 1Abdeckung
Die Scope -Suche beginnt mit dem innersten Bereich, an dem sich die Laufzeit befindet, und erfolgt Schritt für Schritt nach außen oder nach oben, bis die erste passende Kennung erfüllt ist.
Identifikatoren mit demselben Namen können in mehrschichtigen verschachtelten Scopes definiert werden, die als "Okklusionseffekt" bezeichnet werden. Die internen Kennungen "Okklude" externe Kennungen
var a = 0; Funktion test () {var a = 1; console.log (a); // 1} test ();Globale Variablen sind automatisch Attribute globaler Objekte, sodass sie direkt unter Bezugnahme auf die Attribute der globalen Objekte direkt zugreifen können, anstatt direkt den lexikalischen Namen des globalen Objekts zu durchlaufen.
var a = 0; Funktion test () {var a = 1; console.log (window.a); // 0} test ();Diese Technik ermöglicht den Zugriff auf globale Variablen, die durch gleichnamige Variablen verdeckt werden. Wenn jedoch nicht-globale Variablen blockiert sind, können sie nicht zugreifen, egal was passiert.
Dynamischer Bereich
JavaScript verwendet den lexikalischen Umfang und sein wichtigstes Merkmal ist, dass sein Definitionsprozess während der Schreibphase des Codes stattfindet.
Warum dann einen dynamischen Umfang einführen? In der Tat ist der dynamische Umfang ein weiterer wichtiger Mechanismus von JavaScript, um dies zu Cousine. Der größte Teil der Verwirrung des Umfangs besteht darin
Dynamische Bereiche kümmern sich nicht darum, wie Funktionen und Bereiche überall deklariert und deklariert werden, nur wo sie gerufen werden. Mit anderen Worten, Scope -Ketten basieren auf dem Anrufstap
var a = 2; Funktion foo () {console.log (a);} function bar () {var a = 3; foo ();} bar ();[1] Wenn es sich im lexikalischen Bereich befindet, ist es die aktuelle JavaScript -Umgebung. Die Variable A wird zuerst in der Funktion foo () durchsucht, aber nicht gefunden. Folgen Sie also der Geltungskette, um im globalen Bereich zu suchen, einen Wert von 2. zu suchen und zuweisen. Daher gibt die Konsole 2 aus 2 aus
【2】 Wenn es sich im dynamischen Bereich befindet, wird die Variable A zuerst in Foo () gesucht und nicht gefunden. Hier folgen Sie dem Anrufstapel, um an der Stelle zu suchen, an der die Funktion foo () aufgerufen wird, dh die Funktion bar (), finden und zuweisen den Wert 3. Die Konsole gibt also 3 aus 3 aus.
Zusammenfassung: Der Unterschied zwischen den beiden Scopes. Kurz gesagt, das lexikalische Bereich wird zum Zeitpunkt der Definition bestimmt, während der dynamische Bereich zur Laufzeit bestimmt wird.
Das obige ist der zweite Teil des lexikalischen Bereichs und des dynamischen Bereichs, den der Herausgeber Ihnen vorgestellt hat. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie mehr wissen möchten, achten Sie bitte wulin.com!