Der Unterschied liegt in der Umfang der jeweils mit deklarierten Variablen.
In der Praxis ergeben sich aus dem unterschiedlichen Anwendungsbereich eine Reihe nützlicher Konsequenzen:
let
Variablen sind nur in ihren nächste Umgebung Block ( { ... }
).
let
Variablen sind nur in Codezeilen verwendbar, in denen nach die Variable deklariert wird (auch wenn sie werden hochgezogen !).
let
Variablen dürfen nicht durch eine nachfolgende Variable neu deklariert werden. var
o let
.
- Global
let
Variablen werden nicht zu den globalen window
Objekt.
let
Variablen sind einfach zu benutzen mit Verschlüssen (sie verursachen keine Rennbedingungen ).
Die Einschränkungen, die durch let
reduzieren die Sichtbarkeit der Variablen und erhöhen die Wahrscheinlichkeit, dass unerwartete Namenskollisionen frühzeitig erkannt werden. Dies macht es einfacher, die Variablen zu verfolgen und über sie nachzudenken, einschließlich ihrer Erreichbarkeit (hilft bei der Rückgewinnung von ungenutztem Speicher).
Folglich, let
Variablen sind weniger problematisch, wenn sie in großen Programmen verwendet werden oder wenn unabhängig entwickelte Frameworks auf neue und unerwartete Weise kombiniert werden.
var
kann immer noch nützlich sein, wenn Sie sicher sind, dass Sie den Single-Binding-Effekt bei der Verwendung einer Closure in einer Schleife (#5) oder bei der Deklaration von extern sichtbaren globalen Variablen in Ihrem Code (#4) wünschen. Verwendung von var
für Ausfuhren verdrängt werden kann, wenn export
aus dem Transpilerbereich in die Kernsprache migriert.
Beispiele
1. Keine Verwendung außerhalb des nächstgelegenen umschließenden Blocks: Dieser Codeblock führt zu einem Referenzfehler, da die zweite Verwendung von x
außerhalb des Blocks auftritt, in dem sie mit let
:
{
let x = 1;
}
console.log(`x is ${x}`); // ReferenceError during parsing: "x is not defined".
Im Gegensatz dazu wird das gleiche Beispiel mit var
funktioniert.
2. Keine Verwendung vor der Anmeldung:
Dieser Codeblock löst eine ReferenceError
bevor der Code ausgeführt werden kann, weil x
verwendet wird, bevor sie deklariert wird:
{
x = x + 1; // ReferenceError during parsing: "x is not defined".
let x;
console.log(`x is ${x}`); // Never runs.
}
Im Gegensatz dazu wird das gleiche Beispiel mit var
analysiert und ausgeführt, ohne Ausnahmen zu verursachen.
3. Keine Neuanmeldung: Der folgende Code zeigt, dass eine Variable, die mit let
darf später nicht neu deklariert werden:
let x = 1;
let x = 2; // SyntaxError: Identifier 'x' has already been declared
4. Globale, die nicht mit window
:
var button = "I cause accidents because my name is too common.";
let link = "Though my name is common, I am harder to access from other JS files.";
console.log(link); // OK
console.log(window.link); // undefined (GOOD!)
console.log(window.button); // OK
5. Einfache Verwendung mit Verschlüssen: Variablen, die mit var
funktionieren nicht gut mit Verschlüssen in Schlaufen. Hier ist eine einfache Schleife, die die Folge von Werten ausgibt, die die Variable i
zu verschiedenen Zeitpunkten hat:
for (let i = 0; i < 5; i++) {
console.log(`i is ${i}`), 125/*ms*/);
}
Konkret bedeutet dies:
i is 0
i is 1
i is 2
i is 3
i is 4
In JavaScript verwenden wir Variablen oft zu einem deutlich späteren Zeitpunkt als zum Zeitpunkt ihrer Erstellung. Wenn wir dies demonstrieren, indem wir die Ausgabe mit einer Schließung verzögern, die an setTimeout
:
for (let i = 0; i < 5; i++) {
setTimeout(_ => console.log(`i is ${i}`), 125/*ms*/);
}
... die Ausgabe bleibt unverändert, solange wir mit let
. Hätten wir im Gegensatz dazu var i
stattdessen:
for (var i = 0; i < 5; i++) {
setTimeout(_ => console.log(`i is ${i}`), 125/*ms*/);
}
... gibt die Schleife unerwartet fünfmal "i ist 5" aus:
i is 5
i is 5
i is 5
i is 5
i is 5
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.