Wie wird der Blockbereich in der lexikalischen Umgebung verwaltet?

8

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.

%Vor%

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?

%Vor%     
Ben 02.04.2015, 10:06
quelle

2 Antworten

3
%Vor%

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.

  

In Bezug auf ES6,

%Vor%

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).

Siehe

    
mohamedrias 02.04.2015, 10:10
quelle
1

Fragen wie diese beantwortet man am besten mit der Spezifikation :

  

Blockieren : { Anweisungsliste }

     
  1. Lassen Sie oldEnv Ausführungskontext ausführen LexicalEnvironment .
  2.   
  3. Lassen Sie blockEnv NewDeclarativeEnvironment ( oldEnv ).
  4.   
  5. Führe BlockDeclarationInstantiation aus ( StatementList , blockEnv ).
  6.   
  7. Legen Sie den Ausführungskontext fest LexicalEnvironment zu blockEnv .
  8.   
  9. Lassen Sie blockValue das Ergebnis der Auswertung von StatementList sein.
  10.   
  11. Legen Sie den Ausführungskontext fest LexicalEnvironment bis oldEnv .
  12.   
  13. Zurück blockValue .
  14.   

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.

    
Felix Kling 02.04.2015 13:56
quelle

Tags und Links