let

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

Die let-Deklaration deklariert neu zuweisbare, block-skopierte lokale Variablen und initialisiert sie optional mit einem Wert.

Probieren Sie es aus

let x = 1;

if (x === 1) {
  let x = 2;

  console.log(x);
  // Expected output: 2
}

console.log(x);
// Expected output: 1

Syntax

js
let name1;
let name1 = value1;
let name1 = value1, name2 = value2;
let name1, name2 = value2;
let name1 = value1, name2, /* …, */ nameN = valueN;

Parameter

nameN

Der Name der zu deklarierenden Variablen. Jeder muss ein gültiger JavaScript-Bezeichner oder ein Destrukturierungsbindungsmuster sein.

valueN Optional

Anfangswert der Variablen. Kann jeder gültige Ausdruck sein. Standardwert ist undefined.

Beschreibung

Der Gültigkeitsbereich einer mit let deklarierten Variablen ist eine der folgenden geschweiften Klammer-Syntaxen, die die let-Deklaration am nächsten enthalten:

Oder falls keiner der oben genannten Punkte zutrifft:

  • Das aktuelle Modul für Code, der im Modulmodus ausgeführt wird
  • Der globale Gültigkeitsbereich für Code, der im Skriptmodus ausgeführt wird.

Im Vergleich zu var haben let-Deklarationen die folgenden Unterschiede:

  • let-Deklarationen sind sowohl auf Blöcke als auch auf Funktionen beschränkt.

  • Auf let-Deklarationen kann nur zugegriffen werden, nachdem der Deklarationsort erreicht wurde (siehe temporale Totzone). Aus diesem Grund werden let-Deklarationen häufig als nicht hoisted betrachtet.

  • let-Deklarationen erstellen keine Eigenschaften auf globalThis, wenn sie auf höchster Ebene eines Skripts deklariert werden.

  • let-Deklarationen können nicht durch eine andere Deklaration im selben Gültigkeitsbereich erneut deklariert werden.

  • let beginnt Deklarationen, keine Anweisungen. Das bedeutet, dass Sie eine einzelne let-Deklaration nicht als Rumpf eines Blocks verwenden können (was sinnvoll ist, da es keine Möglichkeit gibt, auf die Variable zuzugreifen).

    js
    if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
    

Beachten Sie, dass let als Bezeichnername erlaubt ist, wenn es mit var oder function im nicht-strikten Modus deklariert wird, aber Sie sollten vermeiden, let als Bezeichnername zu verwenden, um unerwartete Syntaxambiguitäten zu vermeiden.

Viele Stilrichtlinien (einschließlich der MDN-Richtlinien) empfehlen, const über let zu verwenden, wann immer eine Variable in ihrem Gültigkeitsbereich nicht neu zugewiesen wird. Dies macht die Absicht klar, dass sich der Typ einer Variablen (oder der Wert im Fall eines Primitives) niemals ändern kann. Andere bevorzugen möglicherweise let für nicht-primitives, die verändert werden.

Die Liste, die dem let-Schlüsselwort folgt, wird als Bindung-Liste bezeichnet und ist durch Kommas getrennt; die Kommas sind nicht Komma-Operatoren und die =-Zeichen sind nicht Zuweisungs-Operatoren. Initialisierer späterer Variablen können sich auf frühere Variablen in der Liste beziehen.

Temporale Totzone (TDZ)

Eine mit let, const oder class deklarierte Variable befindet sich in einer "temporalen Totzone" (TDZ) vom Beginn des Blocks bis der Code die Stelle erreicht, an der die Variable deklariert und initialisiert wurde.

Während der TDZ wurde die Variable nicht mit einem Wert initialisiert, und jeder Versuch, darauf zuzugreifen, führt zu einem ReferenceError. Die Variable wird mit einem Wert initialisiert, wenn die Ausführung die Stelle im Code erreicht, an der sie deklariert wurde. Wenn kein Initialwert mit der Variablendeklaration angegeben wurde, wird sie mit einem Wert von undefined initialisiert.

Dies unterscheidet sich von var Variablen, die einen Wert von undefined zurückgeben, wenn sie aufgerufen werden, bevor sie deklariert werden. Der folgende Code zeigt das unterschiedliche Ergebnis, wenn let und var in Code aufgerufen werden, bevor die Stelle erreicht wird, an der sie deklariert sind.

js
{
  // TDZ starts at beginning of scope
  console.log(bar); // "undefined"
  console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
  var bar = 1;
  let foo = 2; // End of TDZ (for foo)
}

Der Begriff "temporal" wird verwendet, weil die Zone von der Ausführungsreihenfolge (Zeit) abhängt und nicht von der Reihenfolge, in der der Code geschrieben ist (Position). Zum Beispiel funktioniert der untenstehende Code, weil die Funktion, die die let-Variable verwendet, zwar vor der Deklaration der Variable erscheint, die Funktion jedoch außerhalb der TDZ aufgerufen wird.

js
{
  // TDZ starts at beginning of scope
  const func = () => console.log(letVar); // OK

  // Within the TDZ letVar access throws `ReferenceError`

  let letVar = 3; // End of TDZ (for letVar)
  func(); // Called outside TDZ!
}

Die Verwendung des typeof-Operators für eine Variable in ihrer TDZ wird einen ReferenceError auslösen:

js
{
  typeof i; // ReferenceError: Cannot access 'i' before initialization
  let i = 10;
}

Dies unterscheidet sich von der Verwendung von typeof für nicht deklarierte Variablen und Variablen, die einen Wert von undefined enthalten:

js
console.log(typeof undeclaredVariable); // "undefined"

Note: let- und const-Deklarationen werden nur verarbeitet, wenn das aktuelle Skript verarbeitet wird. Wenn Sie zwei