let
и const
имеют два основных отличия от var
:
- Они имеют блочную область видимости .
- Доступ к a
var
до его объявления дает результат undefined
; доступ к a let
или const
до того, как он объявлен, бросает ReferenceError
:
console.log(aVar);
console.log(aLet);
var aVar = 1;
let aLet = 2;
Из этих примеров видно, что let
объявления (и const
, который работает таким же образом) не могут быть подняты , поскольку aLet
они не существуют до того, как им будет присвоено значение.
Это не так, however- let
и const
которые поднимают (например var
, class
и function
), но есть период между вводом и объем объявляется , где они не могут быть доступны. Этот период является временной мертвой зоной (TDZ) .
Протяжен заканчивается , когда aLet
будет объявлен , а не назначается :
let aLet;
console.log(aLet);
aLet = 10;
console.log(aLet);
Этот пример показывает, что let
поднимается:
let x = 'outer value';
(function() {
console.log(x);
let x = 'inner value';
}());
Кредит: Демистификация временной мертвой зоны (TDZ)
Доступ x
во внутренней области по-прежнему вызывает ошибку ReferenceError
. Если бы let
не были подняты, он бы залез outer value
.
TDZ - это хорошо, потому что он помогает выявить ошибки - доступ к значению до того, как оно было объявлено, редко бывает преднамеренным.
TDZ также применяется к аргументам функции по умолчанию. Аргументы оцениваются слева направо, и каждый аргумент находится в TDZ, пока не будет назначен:
function testDefaults(a=b, b) { }
testDefaults(undefined, 1);
TDZ по умолчанию отключен в транспиляторе babel.js. Включите режим «высокого соответствия», чтобы использовать его в REPL . Поставьте es6.spec.blockScoping
флаг, чтобы использовать его с CLI или как библиотеку.
Рекомендуемая дополнительная литература: демистификация TDZ и ES6 Let, Const и «Temporal Dead Zone» (TDZ) in Depth .