Für den Umfang von Variablen verwenden Sprachen wie C und Java die Methode „Blockbereich“. Im Gegensatz dazu verfolgt JavaScript einen „Funktionsbereich“-Ansatz – der Umfang einer Variablen wird nur durch die Funktion bestimmt, in der sie sich befindet, und hat nichts mit logischen Blöcken wie if und for zu tun. Das folgende Beispiel zeigt beispielsweise das Verhalten in JavaScript, das sich von C, Java und anderen Sprachen unterscheidet:
In Sprachen mit „Blockbereich“ wie C und Java werden nach dem Ende logischer Blöcke wie if-Anweisungen und for-Anweisungen die in diesen logischen Blöcken definierten Variablen zerstört. JavaScript ist anders. Solange eine Variable innerhalb einer Funktion definiert ist, kann der gesamte Code innerhalb der gesamten Funktion auf die Variable zugreifen, auch wenn diese Codes vor der Definition der Variablen vorhanden sind:
Wenn im obigen Beispiel noch nie eine In-Funktion definiert wurde, löst console.log(a) einen ReferenceError aus. Wenn a in einer Funktion definiert ist, ist der Aufruf von a eine zulässige Operation, auch wenn die Definition nach der aufrufenden Anweisung einer Variablen erfolgt (wenn die Definition einer Variablen nach der aufrufenden Anweisung erfolgt, dann ist der Wert der Variablen a in der aufrufende Anweisung ist undefiniert). Tatsächlich wird die Definitionsoperation für alle mit dem Schlüsselwort var innerhalb einer Funktion definierten Variablen an den Anfang der Funktion gebracht (die Zuweisungsoperation bleibt weiterhin in der Zeile, in der var definiert ist). Dies wird in JavaScript als Heben bezeichnet. Der obige Code entspricht beispielsweise:
Bereichskette von Variablen
Kontakt Speicherung von Variablen in JavaScript, Sie können ein gutes Verständnis des „Funktionsumfangs“ und des Hebens in JS erlangen. Da Variablen im globalen Objekt oder im Funktionsaufrufobjekt gespeichert werden, gibt es beim Definieren einer Variablen in einer Funktion unabhängig davon, wo die Variable in der Funktion definiert ist, zwangsläufig ein Funktionsaufrufobjekt mit diesem Wert im Funktionsaufrufobjekt . Eine Eigenschaft mit demselben Namen wie die Variable. Auf diese Weise kann von überall in der Funktion auf die Variable zugegriffen werden.
Wenn es um Funktionsaufrufe geht, gibt es in JavaScript ein interessanteres Konzept: die Bereichskette von Variablen – da Variablen im globalen Objekt oder im Funktionsaufrufobjekt gespeichert werden, können Sie beim Zugriff auf die Variable von mehreren darauf zugreifen Objekte. Holen Sie sich den Wert. Nehmen Sie den folgenden Code als Beispiel:
Innerhalb der Level-2-Funktion im obigen Code kann das Programm beim Versuch, auf die x-Variable zuzugreifen, nach dem entsprechenden Attributwert aus drei Objekten suchen: dem Funktionsaufrufobjekt, das zum Aufrufen der Level-2-Funktion verwendet wird, Funktionsaufruf Objekte und globale Objekte, die zum Aufrufen von Funktionen der Ebene 1 verwendet werden – Basierend auf der verschachtelten Beziehung von Funktionsdefinitionen generiert JavaScript eine Objektkette, die aus globalen Objekten und Funktionsaufrufobjekten besteht. Beim Zugriff auf eine Variable beginnt das Programm mit der Suche bei dem Objekt, das der Zugriffsanweisung am nächsten liegt. Wenn keine Suche gefunden wird, wird die Suche im Objekt auf der oberen Ebene der Objektkette bis zum globalen Objekt fortgesetzt.
Da diese Objektkette mit dem Gültigkeitsbereich der Variablen zusammenhängt, wird sie auch „Bereichskette“ genannt.
Wenn Sie die Bereichskette vorübergehend ändern und ein Objekt am Anfang der Bereichskette einfügen müssen (als erstes Funktionsobjekt, auf das zugegriffen wird), können Sie die with-Anweisung verwenden:
Im strikten JavaScript-Modus ist die with-Anweisung jedoch deaktiviert. Auch im nicht strikten Modus wird die Verwendung der with-Anweisung nicht empfohlen.