Der Unterschied liegt im Umfang der mit jedem deklarierten Variablen.
In der Praxis gibt es eine Reihe nützlicher Konsequenzen des unterschiedlichen Umfangs:
let
Variablen sind nur im nächsten umschließenden Block ( { ... }
) sichtbar .
let
Variablen können nur in Codezeilen verwendet werden, die nach der Deklaration der Variablen auftreten (obwohl sie angehoben werden !).
let
Variablen dürfen nicht durch ein nachfolgendes var
oder neu deklariert werden let
.
- Globale
let
Variablen werden dem globalen window
Objekt nicht hinzugefügt .
let
Variablen sind bei Schließungen einfach zu verwenden (sie verursachen keine Rennbedingungen ).
Die durch let
die Einschränkung der Sichtbarkeit der Variablen auferlegten Einschränkungen erhöhen die Wahrscheinlichkeit, dass unerwartete Namenskollisionen frühzeitig erkannt werden. Dies erleichtert das Verfolgen und Überlegen von Variablen, einschließlich ihrer Erreichbarkeit (was bei der Rückgewinnung nicht verwendeten Speichers hilft).
Folglich ist let
es weniger wahrscheinlich, dass Variablen Probleme verursachen, wenn sie in großen Programmen verwendet werden oder wenn unabhängig entwickelte Frameworks auf neue und unerwartete Weise kombiniert werden.
var
Dies kann dennoch nützlich sein, wenn Sie sicher sind, dass Sie den Einzelbindungseffekt wünschen, wenn Sie einen Abschluss in einer Schleife verwenden (Nr. 5) oder wenn Sie extern sichtbare globale Variablen in Ihrem Code deklarieren (Nr. 4). Die Verwendung var
für den Export kann ersetzt werden, wenn export
der Transpiler-Speicherplatz in die Kernsprache migriert wird.
Beispiele
1. Keine Verwendung außerhalb des nächstgelegenen umschließenden Blocks:
Dieser Codeblock gibt einen Referenzfehler aus, da die zweite Verwendung x
außerhalb des Blocks erfolgt, in dem er deklariert ist mit let
:
{
let x = 1;
}
console.log(`x is ${x}`); // ReferenceError during parsing: "x is not defined".
Im Gegensatz dazu var
funktioniert das gleiche Beispiel mit .
2. Keine Verwendung vor der Deklaration:
Dieser Codeblock löst ein aus, ReferenceError
bevor der Code ausgeführt werden kann, da er verwendet x
wird, bevor er deklariert wird:
{
x = x + 1; // ReferenceError during parsing: "x is not defined".
let x;
console.log(`x is ${x}`); // Never runs.
}
Im Gegensatz dazu var
analysiert und läuft das gleiche Beispiel ohne Ausnahmen.
3. Keine erneute Deklaration:
Der folgende Code zeigt, dass eine mit deklarierte Variable let
möglicherweise später nicht erneut deklariert wird:
let x = 1;
let x = 2; // SyntaxError: Identifier 'x' has already been declared
4. Globals, die nicht an Folgendes gebunden sind 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: Mit
deklarierte Variablen var
funktionieren nicht gut mit Verschlüssen in Schleifen. 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*/);
}
Im Einzelnen gibt dies Folgendes aus:
i is 0
i is 1
i is 2
i is 3
i is 4
In JavaScript verwenden wir Variablen häufig zu einem wesentlich späteren Zeitpunkt als beim Erstellen. Wenn wir dies demonstrieren, indem wir die Ausgabe mit einem an Folgendes übergebenen Abschluss verzögern setTimeout
:
for (let i = 0; i < 5; i++) {
setTimeout(_ => console.log(`i is ${i}`), 125/*ms*/);
}
... die Ausgabe bleibt unverändert, solange wir dabei bleiben let
. Im Gegensatz dazu, wenn wir var i
stattdessen verwendet hätten:
for (var i = 0; i < 5; i++) {
setTimeout(_ => console.log(`i is ${i}`), 125/*ms*/);
}
... die Schleife gibt unerwartet fünfmal "i is 5" aus:
i is 5
i is 5
i is 5
i is 5
i is 5
let
ist im Entwurf der 6. Ausgabe enthalten und wird höchstwahrscheinlich in der endgültigen Spezifikation enthalten sein.