Wenn ich eine Variable in einer Funktion mit var
deklariere, wird ein Slot für diese Variable zu dem von dieser Funktion definierten LexicalEnvironment
hinzugefügt.
In dem obigen Code enthält das LexicalEnvironment
, das der Funktion zugeordnet ist, einen Slot mit einem Schlüssel foo
und einem Wert undefined
.
Wie wird die Umgebung LexicalEnvironment
beeinflusst, wenn ich eine Block-Scoped-Deklaration verwende?
Wie bereits erwähnt, ist foo
in LexicalEnvironment
global für alle inneren Funktionen innerhalb dieser Funktion verfügbar.
Aber
%Vor% Hier ist foo
lokal für diesen Block. Es ist außerhalb dieses Blocks nicht sichtbar.
Wie wirkt sich das auf die LexicalEnvironment
aus?
Wenn Sie innerhalb dieses Blocks auf foo
verweisen, überschreibt das lokale let foo
das globale var foo
, das Sie in dieser Funktion definiert haben.
%Vor%In Bezug auf ES6,
Mit einer let
-Anweisung deklarierte Variablen werden als Bindungen in der lexikalischen Umgebung und nicht in der Variablenumgebung des aktuellen Ausführungskontexts erstellt. Eine Änderung der Spezifikation von Blockanweisungen in ES6 bedeutet, dass jeder Block seine eigene lexikalische Umgebung hat. Im obigen Beispiel wird eine neue lexikalische Umgebung erstellt, wenn der Block (der Rumpf der if-Anweisung) ausgewertet wird. Wenn die let-Anweisung ausgewertet wird, wird dieser lexikalischen Umgebung eine Bindung hinzugefügt, die nicht von der äußeren lexikalischen Umgebung aus zugreifbar ist (die der Funktionsdeklaration selbst).
Fragen wie diese beantwortet man am besten mit der Spezifikation :
Blockieren : { Anweisungsliste }
- Lassen Sie oldEnv Ausführungskontext ausführen LexicalEnvironment .
- Lassen Sie blockEnv NewDeclarativeEnvironment ( oldEnv ).
- Führe BlockDeclarationInstantiation aus ( StatementList , blockEnv ).
- Legen Sie den Ausführungskontext fest LexicalEnvironment zu blockEnv .
- Lassen Sie blockValue das Ergebnis der Auswertung von StatementList sein.
- Legen Sie den Ausführungskontext fest LexicalEnvironment bis oldEnv .
- Zurück blockValue .
HINWEIS: Egal, wie die Kontrolle den Block verlässt, die lexikalische Umgebung wird immer in ihren früheren Zustand zurückversetzt.
Was passiert hier?
Wenn der Block ausgewertet wird, wird eine neue lexikalische Umgebung mit der aktuellen lexikalischen Umgebung als "übergeordnetes" erstellt. Die neue Umgebung ersetzt die aktuelle Umgebung für die Dauer der Auswertung des Blocks.
Wie wird die Umgebung
LexicalEnvironment
beeinflusst, wenn ich eine Block-Scoped-Deklaration verwende?
Anders als es vorübergehend ersetzt wird, ist es überhaupt nicht betroffen.
Tags und Links javascript ecmascript-6