let
Blockumfang
Variablen, die mit der Option let
Schlüsselwortes sind block-scoped, d.h. sie sind nur in der Block in dem sie angemeldet wurden.
Auf der obersten Ebene (außerhalb einer Funktion)
Auf der obersten Ebene werden Variablen, die mit let
keine Eigenschaften für das globale Objekt erstellen.
var globalVariable = 42;
let blockScopedVariable = 43;
console.log(globalVariable); // 42
console.log(blockScopedVariable); // 43
console.log(this.globalVariable); // 42
console.log(this.blockScopedVariable); // undefined
Innerhalb einer Funktion
Innerhalb einer Funktion (aber außerhalb eines Blocks), let
hat den gleichen Geltungsbereich wie var
.
(() => {
var functionScopedVariable = 42;
let blockScopedVariable = 43;
console.log(functionScopedVariable); // 42
console.log(blockScopedVariable); // 43
})();
console.log(functionScopedVariable); // ReferenceError: functionScopedVariable is not defined
console.log(blockScopedVariable); // ReferenceError: blockScopedVariable is not defined
Innerhalb eines Blocks
Variablen, die mit let
innerhalb eines Blocks können nicht außerhalb dieses Blocks aufgerufen werden.
{
var globalVariable = 42;
let blockScopedVariable = 43;
console.log(globalVariable); // 42
console.log(blockScopedVariable); // 43
}
console.log(globalVariable); // 42
console.log(blockScopedVariable); // ReferenceError: blockScopedVariable is not defined
Innerhalb einer Schleife
Variablen, die mit let
in Schleifen können nur innerhalb dieser Schleife referenziert werden.
for (var i = 0; i < 3; i++) {
var j = i * 2;
}
console.log(i); // 3
console.log(j); // 4
for (let k = 0; k < 3; k++) {
let l = k * 2;
}
console.log(typeof k); // undefined
console.log(typeof l); // undefined
// Trying to do console.log(k) or console.log(l) here would throw a ReferenceError.
Schleifen mit Verschlüssen
Wenn Sie let
anstelle von var
in einer Schleife, bei jeder Iteration erhalten Sie eine neue Variable. Das bedeutet, dass Sie eine Schließung innerhalb einer Schleife sicher verwenden können.
// Logs 3 thrice, not what we meant.
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
// Logs 0, 1 and 2, as expected.
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 0);
}
Zeitlich tote Zone
Wegen der die zeitlich tote Zone Variablen, die mit let
können nicht aufgerufen werden, bevor sie deklariert sind. Der Versuch, dies zu tun, führt zu einem Fehler.
console.log(noTDZ); // undefined
var noTDZ = 43;
console.log(hasTDZ); // ReferenceError: hasTDZ is not defined
let hasTDZ = 42;
Keine Neuanmeldung
Sie können dieselbe Variable nicht mehrfach deklarieren, indem Sie let
. Sie können eine Variable auch nicht deklarieren, indem Sie let
mit demselben Bezeichner wie eine andere Variable, die mit var
.
var a;
var a; // Works fine.
let b;
let b; // SyntaxError: Identifier 'b' has already been declared
var c;
let c; // SyntaxError: Identifier 'c' has already been declared
const
const
ist sehr ähnlich zu let
-Es ist blockiert und hat TDZ. Es gibt jedoch zwei Dinge, die anders sind.
Keine Neuzuteilung
Variable, die mit const
kann nicht neu zugewiesen werden.
const a = 42;
a = 43; // TypeError: Assignment to constant variable.
Dies bedeutet jedoch nicht, dass der Wert unveränderlich ist. Seine Eigenschaften können immer noch geändert werden.
const obj = {};
obj.a = 42;
console.log(obj.a); // 42
Wenn Sie ein unveränderliches Objekt haben wollen, sollten Sie Object.freeze()
.
const obj = Object.freeze({a: 40});
obj.a = 42;
console.log(obj.a); // 40
console.log(obj.b); // undefined
Initialisierung ist erforderlich
Sie müssen immer einen Wert angeben, wenn Sie eine Variable mit const
.
const a; // SyntaxError: Missing initializer in const declaration
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.