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 .