Что такое временная мертвая зона?
Я слышал, что при обращении let
и const
значения до того, как они были объявлены, может вызвать ReferenceError
из-за чего-то под названием временная мертвая зона.
что такое временная мертвая зона, как она соотносится с объемом и подъемом, и в каких ситуациях она встречается?
1 ответ:
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
не существует до присвоения ему значения.однако это не так -
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
во внутренней области все еще вызывает aReferenceError
. Если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) в глубине.