Account creation on MDN is disabled while we upgrade our moderation mechanisms. If you see something that needs to be fixed, please file a bug: https://bugzilla.mozilla.org/form.doc and we'll handle it as soon as we can. Thanks for your patience!

This article needs an editorial review. How you can help.

Diese Übersetzung ist unvollständig. Bitte helfen Sie, diesen Artikel aus dem Englischen zu übersetzen.

Zusammenfassung

Das Schlüsselwort let deklariert eine Variable im Gültigkeitsbereich des lokalen Blocks. Optional wird die Variable mit einem Wert initialisiert.

Hinweis: Innerhalb von HTML ist das let-Schlüsselwort nur in <script type="application/javascript;version=1.7">-Blöcken verfübar (d.h. Version 1.7 oder höher). In XUL kann let benutzt werden, ohne dass dieser spezielle Block benötigt wird.

Syntax

let var1 [= wert1] [, var2 [= wert2]] [, ..., varN [= wertN]];

Parameter

var1, var2, …, varN
Variablenname. Jeder legale Bezeichner ist erlaubt.
wert1, wert2, …, wertN
Initialwert der Variablen. Jeder legale Ausdruck ist erlaubt.

Beschreibung

let ermöglicht es Variablen zu deklarieren, deren Gültigkeitsbereich auf den Block, den Befehl oder den Ausdruck beschränkt ist, in dem sie deklariert sind. Der Unterschied zum var-Schlüsselwort ist, dass der Gültigkeitsbereich auf Blöcke und nicht auf Funktionen beschränkt ist.

Blocksichtbarkeitsbereich mit let

Das let-Schlüsselwort wird genutzt, um eine Variable in einem Block zu definieren.


if (x > y) {
  let gamma = 12.7 + y;
  i = gamma * x;
}

Man kann let einsetzten, um Pseudonamensräumen einen neuen Namen zu geben. (Siehe Security best practices in extensions.)


let Cc = Components.classes, Ci = Components.interfaces;

let macht den Programmcode manchmal leserlicher, wenn innere Funktionen eingesetzt werden.


var list = document.getElementById("list");

for (var i = 1; i <= 5; i++) {
  var item = document.createElement("LI");
  item.appendChild(document.createTextNode("Item " + i));

  let j = i;
  item.onclick = function (ev) {
    console.log("Item " + j + " is clicked.");
  };
  list.appendChild(item);
}

Dieses Beispiel funktioniert wie intendiert, weil alle fünf Instanzen der anonymen inneren Funktionen auf verschiedene Instanzen der Variable j zugreifen. Wenn stattdessen var verwendet wird oder in der inneren Funktion statt j zu deklarieren i benutzt wird, funktioniert dies nicht.

Regeln für Gültigkeitsbereiche

Variablen, die mit let deklariert werden, haben als Gültigkeitsbereich den Block in dem sie definiert wurden und alle weiteren Unterblöcke in denen sie nicht neu definiert werden. In dieser Hinsicht funktioniert let ähnlich wie var. Der Unterschied besteht darin, dass der Gültigkeitbereich bei var-deklarierten Variablen die umschließende Funktion ist:


function varTest() {
  var x = 31;
  if (true) {
    var x = 71;  // gleiche Variable!
    console.log(x);  // 71
  }
  console.log(x);  // 71
}

function letTest() {
  let x = 31;
  if (true) {
    let x = 71;  // andere variable
    console.log(x);  // 71
  }
  console.log(x);  // 31
}

Auf der ersten Ebene des Programmes oder von Funktionen funktioniert let exakt wie var. Zum Beispiel:


var x = 'global';
let y = 'global';
console.log(this.x); //global
console.log(this.y); //global

Zeitweilig tote Zonen und Fehler mit let

Eine wiederholte Deklaration einer Variablen im gleichen Blockgültigkeitsbereich führt zu einem TypeError.


if (x) {
  let foo;
  let foo; // TypeError
}

Funktionen besitzten diese Einschränkung nicht!


function do_something() {
  let foo;
  let foo; // Funktioniert fehlerfrei.
}

In ECMAScript 6, werden Deklarationen mit let nicht an den Anfang des Blocks verschoben (hoist). Wird eine Variable vor der Deklaration in einem Block referenziert, führt dies zu einem ReferenceError, weil sich die Variable bei Eintritt in den Block bis zur Verarbeitung der Deklaration in einer "zeitweilig toten Zone" (temporal dead zone) befindet.


function do_something() {
  console.log(foo); // ReferenceError
  let foo = 2;
}

Ein switch-Block besteht nur aus einem Block, so dass Fehler wie im folgenden Beispiel auftreten können.


switch (x) {
  case 0:
    let foo;
    break;
    
  case 1:
    let foo; // TypeError
    break;
}

Gültigkeitsbereich für let-Variablen in for-Schleifen

Mit let können Schleifenvariablen auf den Gültigkeitsbereich von for-Schleifen beschränkt werden. Der Unterschied zum Einsatz einer var-Variablen ist, dass diese nicht für die ganze Funktion sichtbar wird, in der die Schleife auftritt.


var i=0;
for ( let i=i ; i < 10 ; i++ ) {
  console.log(i);
}

Sichtbarkeitsregeln


for (let expr1; expr2; expr3) statement

Hier befinden sich expr2, expr3 und statement in einem impliziten Block, der die Variable expr1 enthält. Diese Variable wurde mit let deklariert und ist deswegen nur in diesem Block sichtbar. Das darüberstehende Beispiel demonstriert dies.

Beispiele

let vs var

Beim Einsatz von let in einem Block wird der Sichtbarkeitsbereich der Variablen auf den Block beschränkt. Beachte den Unterschied zu var-Variablen, deren Gültigkeitsbereich die Funktion ist, in der sie deklariert wurden.


var a = 5;
var b = 10;

if (a === 5) {
  let a = 4; // Gültigkeitsbereich im if-Block
  var b = 1; // Gültigkeitsbereich in der Funktion

  console.log(a);  // 4
  console.log(b);  // 1
} 

console.log(a); // 5
console.log(b); // 1

let in Schleifen

Man kann das let-Schlüsselwort nutzen, um Variablem für den lokalen Block der Schleife zu definieren. Dabei entsteht keine globale Variable wie bei dem einsatz von var-Deklarationen.


for (let i = 0; i<10; i++) {
  console.log(i); // 0, 1, 2, 3, 4 ... 9
}

console.log(i); // i ist nicht definiert.

Nicht standardisierte let-Erweiterungen

The let block and let expression syntax is non-standard and will be removed in the future. Do not use them! See Bug 1023609 for more details.

let block

The let block provides a way to associate values with variables within the scope of a block, without affecting the values of like-named variables outside the block.

Syntax


let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) statement;

Description

The let block provides local scoping for variables. It works by binding zero or more variables in the lexical scope of a single block of code; otherwise, it is exactly the same as a block statement. Note in particular that the scope of a variable declared inside a let block using var is still the same as if it had been declared outside the let block; such variables still have function scoping. When using the let block syntax, the parentheses following let are required. Failure to include them will result in a syntax error.

Example


var x = 5;
var y = 0;

let (x = x+10, y = 12) {
  console.log(x+y); // 27
}

console.log(x + y); // 5

The rules for the code block are the same as for any other code block in JavaScript. It may have its own local variables established using the let declarations.

Scoping rules

The scope of variables defined using let is the let block itself, as well as any inner blocks contained inside it, unless those blocks define variables by the same names.

let expressions

The let expression lets you establish variables scoped only to a single expression.

Syntax


let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) expression;

Example

You can use let to establish variables that are scoped only to a single expression:


var a = 5;
let(a = 6) console.log(a); // 6
console.log(a); // 5

Scoping rules

Given a let expression:


let (decls) expr

There is an implicit block created around expr.

Specifications

Specification Status Comment
ECMAScript 6 (ECMA-262)
Die Definition von 'Let and Const Declarations' in dieser Spezifikation.
Anwärter Empfehlung Initial definition. Does not specify let expressions or let statements.

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Ja) 2.0 (1.8.1) [1] 11 17 ?
Temporal dead zone ? 35 (35) [1] ? ? ?
let expression Nicht unterstützt 2.0 (1.8.1) [1] Nicht unterstützt Nicht unterstützt Nicht unterstützt
let block Nicht unterstützt 2.0 (1.8.1) [1] Nicht unterstützt Nicht unterstützt Nicht unterstützt
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support ? ? 1.0 (1.8.1) [1] ? ? ?
Temporal dead zone ? ? 35.0 (35) [1] ? ? ?
let expression Nicht unterstützt Nicht unterstützt 1.0 (1.8.1) [1] Nicht unterstützt Nicht unterstützt Nicht unterstützt
let block Nicht unterstützt Nicht unterstützt 1.0 (1.8.1) [1] Nicht unterstützt Nicht unterstützt Nicht unterstützt

Firefox-specific notes

  • [1]: Only available to code blocks in HTML wrapped in a <script type="application/javascript;version=1.7"> block (or higher version). XUL script tags have access to these features without needing this special block. See Bug 932517 and Bug 932513.
  • ES6 compliance for let in SpIderMonkey is tracked in Bug 950547 and non-standard extensions are going to be removed in the future Bug 1023609.

See also

Schlagwörter des Dokuments und Mitwirkende

 Mitwirkende an dieser Seite: AndreeWille, th-we, chk1, fscholz, schlagi123
 Zuletzt aktualisiert von: AndreeWille,