Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

let

Оператор let объявляет переменную с блочной областью видимости с возможностью инициализировать её значением.
 

Синтаксис

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

Параметры

var1, var2, …, varN
Имя переменной. Может использоваться любой допустимый идентификатор.
value1, value2, …, valueN
Значение переменной. Любое допустимое выражение.

Описание

Оператор let позволяет объявить локальную переменную с ограниченной текущим блоком кода областью видимости. В отличие от ключевого слова var, которое объявляет переменную глобально или локально во всей функции независимо от области блока.

Блочная область видимости с let

Используйте ключевое слово let для определения переменной внутри блока.

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

let иногда делает код чище при использовании вложенных функции .

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);
}

Пример выше будет выполнен как и ожидается, так как пять экземпляров внутренней функции (анонимной) будут ссылаться на пять разных экземпляров переменной j. Пример будет выполнен неверно, если заменить оператор let на var, или удалить переменную j и использовать перемерную i во внутренней функции.

Правила области видимости

Областью видимости переменных, объявленных ключевым словом let, является блок, в котором они объявлены, и все его подблоки. В этом работа оператора let схожа с работой оператора var. Основная разница заключается в том, что областью видимости переменной, объявленной оператором var, является вся функция, в которой она объявлена:

function varTest() {
  var x = 31;
  if (true) {
    var x = 71;  // та же переменная!
    console.log(x);  // 71
  }
  console.log(x);  // 71
}

function letTest() {
  let x = 31;
  if (true) {
    let x = 71;  // другая переменная
    console.log(x);  // 71
  }
  console.log(x);  // 31
}

На верхнем уровне скриптов и функций let, в отличии от var, не создает свойства на глобально объекте. Например:

var x = 'кижуч';
let y = 'карась';
console.log(this.x);
console.log(this.y);

В выводе программы будет отображено слово "кижуч" для this.x, но undefined для this.y.

Временные мертвые зоны и ошибки при использовании let

Повторное объявление той же переменной в том же блоке или функции приведет к выбросу исключения SyntaxError.

if (x) {
  let foo;
  let foo; // SyntaxError thrown.
}

В стандарте ECMAScript 2015 переменные, объявленный оператором let, переносятся наверх блока. Но если вы сошлетесь в блоке на переменную, до того как она будет объявлена оператором let, то это приведет к выбросу исключения ReferenceError, потому что переменная находится во "временной мертвой зоне" с начала блока и до момента ее объявления.

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

Вы можете столкнуться с ошибкой в операторах блока  switch, так как он имеют только один подблок.

switch (x) {
  case 0:
    let foo;
    break;

  case 1:
    let foo; // Выброс SyntaxError из-за повторного объявления переменной
    break;
}

Использование let в циклах for

Вы можете использовать ключевое слово let для привязки переменных к локальной области видимости цикла for. Разница с использованием var в заголовке цикла for, заключается в том, что переменные объявленные var, будут видны во всей функции, в которой находится этот цикл.

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

Правила области видимости

for (let expr1; expr2; expr3) statement

В этом примере expr2, expr3, statement  заключены в неявный блок, который содержит блок локальных переменный объявленых конструкцией let expr1. Пример приведен выше.

Примеры

let vs var

Когда let используется внутри блока, то область видимости переменной ограничивается этим блоком. Напомним, что отличие заключается в том, что областью видимости переменных, объявленных оператором var, является вся функция, в которой они были объявлены.

var a = 5;
var b = 10;

if (a === 5) {
  let a = 4; // The scope is inside the if-block
  var b = 1; // The scope is inside the function

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

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

let в циклах

Вы можете использовать ключевое слово let для привязки переменных к локальной области видимости цикла for, вместо того что бы использовать глобальные переменные (объявленные с помощью var).

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

console.log(i); // i is not defined

Нестандартизированные расширения let

let блок

Поддержка let блоков была убрана в Gecko 44  ошибка 1023609.

let блок предоставляет способ, ассоциировать значения с перемеными внутри области видимости этого блока, без влияния на значения переменных с теми же именами вне этого блока.

Синтаксис

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

Описание

let блок предоставляет локальную область видимости для перемнных. Работа его заключается в привязке нуля или более переменных к области видимости этого блока кода, другими словами, он является блоком операторов. Отметим, что область видимости переменных, объявленных оператором var, в блоке let, будет той же самой, что и если бы эти переменные были объявленны вне блока let, иными словами областью видимости таких переменных по-прежнему является функция. Скобки в блоке let являются обязательными. Опускание их приведет к синтаксической ошибке.

Пример

var x = 5;
var y = 0;

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

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

Правила для этого блока кода аналогичны как и для любого другого блока кода в JavaScript. Он может содержать свои локальные переменные, объявленные let.

Правила области видимости

Областью видимости переменных, объявленных оператором let, в блоке let является сам блок и все подблоки в нем, если они не содержат объявлений переменных с теми же именами. 

let выражения

Поддержка let выражений была убрана в Gecko 41  ошибка 1023609.

let выражение позволяет объявить переменные с областью видимости ограниченной одним выражением.

Синтаксис

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

Пример

Вы можете использовать let для объявления переменных, областью видимости которых является только одно выражение:

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

Правила области видимости

В данном let выражении:

let (decls) expr

expr оборачивается в неявный блок.

Спецификации

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Let and Const Declarations' в этой спецификации.
Стандарт Первоначальное определение. Не описывает let выражения или let блоки.
ECMAScript 2017 Draft (ECMA-262)
Определение 'Let and Const Declarations' в этой спецификации.
Черновик  

Поддержка браузерами

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support

41.0

2.0 (1.8.1) [1] 11 17 ?
Temporal dead zone ? 35 (35) [1] ? ? ?
let expression Нет 2.0 (1.8.1) [1] Нет Нет Нет
let block Нет 2.0 (1.8.1) [1] Нет Нет Нет
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support ?

41.0

1.0 (1.8.1) [1] ? ? ?
Temporal dead zone ? ? 35.0 (35) [1] ? ? ?
let expression Нет Нет 1.0 (1.8.1) [1] Нет Нет Нет
let block Нет Нет 1.0 (1.8.1) [1] Нет Нет Нет

 

Особенности Firefox

  • До SpiderMonkey 46 (Firefox 46 / Thunderbird 46 / SeaMonkey 2.43) выбрасывал TypeError на повторное объявление, вместо SyntaxError (ошибка 1198833).
  • До SpiderMonkey 44 (Firefox 44 / Thunderbird 44 / SeaMonkey 2.41), let был доступен только для блоков кода обернутых в HTML <script type="application/javascript;version=1.7">block (or higher version) и имел другую сематнику.
  • Поддержка в Worker код спрятан за dom.workers.latestJSVersion флагом (ошибка 487070). Без версии let, флаг будет удален в будущем (ошибка 1219523).
  • Соблюдение стандарта ES6 для let в SpIderMonkey отслеживатся в ошибка 950547

Метки документа и участники

 Внесли вклад в эту страницу: andbas, iseeyou911, smichrissoft, stek29, Tvortsa, fscholz, teoli, nurbek.ab
 Обновлялась последний раз: andbas,