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