Что такое временная мертвая зона?
Я слышал, что при обращении 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иconstare подсадил (как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) в глубине.