Что такое временная мертвая зона?


Я слышал, что при обращении let и const значения до того, как они были объявлены, может вызвать ReferenceError из-за чего-то под названием временная мертвая зона.

что такое временная мертвая зона, как она соотносится с объемом и подъемом, и в каких ситуациях она встречается?

1 101

1 ответ:

let и const есть два основных отличия от var:

  1. они блок.
  2. к 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 не существует до присвоения ему значения.

однако это не так -let и const are подсадил (как var,class и function), но есть период между вводом области и объявлением, где они не могут быть доступны. этот период является временной мертвой зоной (TDZ).

TDZ заканчивается, когда 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 во внутренней области все еще вызывает a 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.

TDZ не включен по умолчанию в Бабель.js transpiler. Включите режим "высокое соответствие", чтобы использовать его в REPL. Поставьте es6.spec.blockScoping флаг, чтобы использовать его с CLI или в качестве библиотеки.

рекомендовано далее чтение:ТДЗ демистифицированный и ES6 Let, Const и "временная Мертвая зона" (TDZ) в глубине.