Javascript Scope Privatsphäre bricht?

8

Ich bin also gerade auf etwas sehr Seltsames gestoßen, als ich gerade an einem Javascript-Projekt gearbeitet habe und hier ist ein gekochtes Beispiel für die Situation, über die ich verwirrt bin:

%Vor%

Wenn Sie doSomething () aufrufen, können Sie in der 2. for-Schleife auf die Variable ose bePrivate zugreifen.

Sollte das nicht möglich sein?

    
Parad0x13 22.03.2017, 07:10
quelle

2 Antworten

5

Alle lokalen Variablen in Javascript haben einen Funktionsumfang und nicht den Blockbereich ( atleast vor ECMAScript 2015 ). Dies bedeutet, dass deklarierte Variablen innerhalb der Funktion für die gesamte Funktion verfügbar sind.

Was Sie meinen, ist der Blockumfang. Leider noblock scope in Javascript bis ECMA2015 . Von ECMAScript 2015 können Sie Ihre Variablen mit let deklarieren, auf die nur im Block verwiesen werden kann, und sie sterben, sobald Sie den Block verlassen.

MDN-Dokumentation sagt (mit Beispielen)

  

Block-Scoping-Regeln

     

Mit var

     

Variablen, die mit var deklariert wurden, haben keinen Blockbereich. Mit einem Block eingefügte Variablen werden auf die umschließende Funktion oder das Skript beschränkt, und die Auswirkungen der Einstellung bleiben über den Block hinaus bestehen. Mit anderen Worten, Blockanweisungen führen keinen Bereich ein. Obwohl "Standalone" -Blöcke gültige Syntax sind, möchten Sie keine eigenständigen Blöcke in JavaScript verwenden, da sie nicht tun, was Sie denken, wenn sie denken, dass sie solche Blöcke in C oder Java machen. Für

%Vor%
  

Dies protokolliert 2, da sich die Anweisung var x innerhalb des Blocks im selben Gültigkeitsbereich wie die Anweisung var x vor dem Block befindet. In C oder Java hätte der entsprechende Code 1 ausgegeben.

     

Mit let und const

     

Im Gegensatz dazu haben Bezeichner, die mit let und const deklariert wurden, einen Blockbereich:

%Vor%     
quelle
2

Sie sind auf etwas gestoßen, das Heben genannt wird. Da alle Variablen auf ihre enthaltene Funktion beschränkt sind, werden var -Anweisungen intern an den Anfang der Funktion verschoben.

Das bedeutet, dass der Interpreter diesen Code tatsächlich ausführt:

%Vor%

Ab ES2015 können Sie das Schlüsselwort let anstelle von var verwenden, das lexikalisch begrenzt ist - d. h. innerhalb von Blöcken definiert ist, dh let shouldBePrivate = 5; existiert außerhalb der ersten Schleife nicht.

%Vor%     
iblamefish 22.03.2017 07:20
quelle

Tags und Links