Ich möchte diese Schlüsselwörter mit dem Ausführungskontext verknüpfen, denn der Ausführungskontext ist bei all dem wichtig. Der Ausführungskontext hat zwei Phasen: eine Erstellungsphase und eine Ausführungsphase. Darüber hinaus hat jeder Ausführungskontext eine variable Umgebung und eine äußere Umgebung (seine lexikalische Umgebung).
Während der Erstellungsphase eines Ausführungskontextes speichern var, let und const ihre Variable weiterhin mit einem undefinierten Wert in der Variablenumgebung des jeweiligen Ausführungskontextes im Speicher. Der Unterschied liegt in der Ausführungsphase. Wenn Sie eine mit var definierte Variable referenzieren, bevor ihr ein Wert zugewiesen wird, ist sie einfach undefiniert. Es wird keine Ausnahme ausgelöst.
Sie können jedoch nicht auf die mit let oder const deklarierte Variable verweisen, bevor sie deklariert ist. Wenn Sie versuchen, sie zu verwenden, bevor sie deklariert ist, wird während der Ausführungsphase des Ausführungskontexts eine Ausnahme ausgelöst. Nun befindet sich die Variable dank der Erstellungsphase des Ausführungskontextes noch im Speicher, aber die Engine erlaubt Ihnen nicht, sie zu verwenden:
function a(){
b;
let b;
}
a();
> Uncaught ReferenceError: b is not defined
Wenn die Engine bei einer mit var definierten Variablen die Variable nicht in der Variablenumgebung des aktuellen Ausführungskontexts finden kann, geht sie in der Scope Chain (der äußeren Umgebung) nach oben und sucht in der Variablenumgebung der äußeren Umgebung nach der Variablen. Wenn sie dort nicht gefunden wird, wird die Suche in der Scope Chain fortgesetzt. Dies ist bei let und const nicht der Fall.
Das zweite Merkmal von let ist die Einführung des Blockumfangs. Blöcke werden durch geschweifte Klammern definiert. Beispiele sind Funktionsblöcke, if-Blöcke, for-Blöcke usw. Wenn Sie eine Variable mit let innerhalb eines Blocks deklarieren, ist die Variable nur innerhalb des Blocks verfügbar. Jedes Mal, wenn der Block ausgeführt wird, z. B. innerhalb einer for-Schleife, wird eine neue Variable im Speicher angelegt.
ES6 führt auch das const-Schlüsselwort für die Deklaration von Variablen ein. const ist auch blockskaliert. Der Unterschied zwischen let und const besteht darin, dass const-Variablen mit einem Initialisierer deklariert werden müssen, sonst wird ein Fehler erzeugt.
Was schließlich den Ausführungskontext betrifft, so werden die mit var definierten Variablen an das Objekt "this" angehängt. Im globalen Ausführungskontext ist das in den Browsern das Window-Objekt. Dies ist bei let oder const nicht der Fall.
133 Stimmen
ECMAScript ist der Standard und
let
ist enthalten in der Entwurf der 6. Auflage und wird höchstwahrscheinlich in der endgültigen Spezifikation enthalten sein.12 Stimmen
Véase kangax.github.io/es5-compat-table/es6 für eine aktuelle Unterstützungsmatrix der ES6-Funktionen (einschließlich let). Zum Zeitpunkt der Erstellung dieses Artikels unterstützen Firefox, Chrome und IE11 diese Funktion (obwohl ich glaube, dass die Implementierung von FF nicht ganz Standard ist).
37 Stimmen
Die längste Zeit wusste ich nicht, dass Variablen in einer for-Schleife auf die Funktion, in die sie eingeschlossen war, skaliert wurden. Ich erinnere mich, dass ich dies zum ersten Mal herausfand und dachte, es sei sehr dumm. Jetzt weiß ich allerdings, wie die beiden aus unterschiedlichen Gründen verwendet werden können und dass man in manchen Fällen eine Variable in einer for-Schleife verwenden möchte, ohne dass sie auf den Block skaliert ist.
1 Stimmen
In dem Maße, wie sich die Unterstützung von ES6-Funktionen verbessert, verlagert sich der Schwerpunkt der Frage nach der Akzeptanz von ES6 von der Unterstützung von Funktionen auf Leistungsunterschiede. Als solches, Hier ist eine Website, die ich gefunden Benchmarking Leistungsunterschiede zwischen ES6 und ES5 . Beachten Sie, dass sich dies im Laufe der Zeit wahrscheinlich ändern wird, da die Engines für ES6-Code optimiert werden.