Der Unterschied liegt im Umfang der mit jedem deklarierten Variablen.
In der Praxis gibt es eine Reihe nützlicher Konsequenzen des unterschiedlichen Umfangs:
letVariablen sind nur im nächsten umschließenden Block ( { ... }) sichtbar .
letVariablen können nur in Codezeilen verwendet werden, die nach der Deklaration der Variablen auftreten (obwohl sie angehoben werden !).
letVariablen dürfen nicht durch ein nachfolgendes varoder neu deklariert werden let.
- Globale
letVariablen werden dem globalen windowObjekt nicht hinzugefügt .
letVariablen sind bei Schließungen einfach zu verwenden (sie verursachen keine Rennbedingungen ).
Die durch letdie 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 letes 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.
varDies 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 varfür den Export kann ersetzt werden, wenn exportder 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 xauß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 varfunktioniert das gleiche Beispiel mit .
2. Keine Verwendung vor der Deklaration:
Dieser Codeblock löst ein aus, ReferenceErrorbevor der Code ausgeführt werden kann, da er verwendet xwird, 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 varanalysiert und läuft das gleiche Beispiel ohne Ausnahmen.
3. Keine erneute Deklaration:
Der folgende Code zeigt, dass eine mit deklarierte Variable letmö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 varfunktionieren nicht gut mit Verschlüssen in Schleifen. Hier ist eine einfache Schleife, die die Folge von Werten ausgibt, die die Variable izu 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 istattdessen 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
letist im Entwurf der 6. Ausgabe enthalten und wird höchstwahrscheinlich in der endgültigen Spezifikation enthalten sein.