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) у глибині .