let
і const
мають дві широкі відмінності від var
:
- Вони є блок-діапазоном .
- Отриманий результат
var
до доступу до його оголошення undefined
; доступ до let
або const
до того, як це оголошено кидками ReferenceError
:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
З цих прикладів випливає, що let
декларації (і const
, що працює однаково) можуть не бути піднятими , оскільки, aLet
здається, не існують до того, як їй буде призначено значення.
Це не так, however- let
і const
які піднімають (наприклад var
, class
і function
), але є період між введенням і обсяг оголошується , де вони не можуть бути доступні. Цей період є тимчасовою мертвою зоною (ТДЗ) .
Протяжен закінчується , коли aLet
буде оголошено , а не призначається :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Цей приклад показує, що let
піднімається:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Кредит: Демістифікована часова мертва зона (TDZ)
Доступ x
у внутрішньому обсязі всі ще викликає ReferenceError
. Якби let
не піднімали, це входило б у журнал outer value
.
TDZ - це гарна річ, оскільки допомагає виділити помилки - доступ до значення до того, як було оголошено, рідко є навмисним.
TDZ також застосовується до аргументів функції за замовчуванням. Аргументи оцінюються зліва направо, і кожен аргумент знаходиться в TDZ, поки він не буде призначений:
// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.
TDP не включений за замовчуванням у транспілері babel.js . Увімкніть режим "високої відповідності", щоб використовувати його в системі REPL . Поставте es6.spec.blockScoping
прапор, щоб використовувати його з CLI або як бібліотеку.
Рекомендовано для подальшого читання: демістифіковані TDZ та ES6 Let, Const та "тимчасова мертва зона" (TDZ) у глибині .