Что такое временная мертвая зона?
Я слышал, что доступ 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
подняты (как 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
во внутренней области все еще вызывает 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 не включен по умолчанию в транспортере babel.js. Включите режим "высокого соответствия", чтобы использовать его в REPL. Поставьте es6.spec.blockScoping
флаг, чтобы использовать его с CLI или в качестве библиотеки.
Рекомендуется дальнейшее чтение: TDZ демистифицированы и ES6 Let, Const и "Временная мертвая зона" (TDZ) в глубине.
Подъемно:let
,const
,var
Все подняты.
(что означает, что они идут вверх и объявляются в верхней части области.)
Инициализация:
var
иди и брось начальный процесс, и получи начальное значениеundefined
,- пока
let
,const
не пошли бросить начальный процесс, поэтому их значения по-прежнему недоступны, хотя они уже объявлены. что положило их вtemporal dead zone
Итак, в скором времени:
Процесс подъема:
var
,let
,const
Процесс инициализации:var
В случае переменных let и const, в основном, временная мертвая зона является зоной
"до того, как ваша переменная объявлена",
то есть, где вы не можете получить доступ к значению этих переменных, он выдаст ошибку.
ех.
let sum = a + 5; //---------
//some other code // | ------> this is TDZ for variable a
// |
console.log(sum) //---------
let a = 5;
код выше выдает ошибку
тот же код не выдаст ошибку, когда мы используем var для переменной 'a',
ех.
var sum = a;
console.log(sum) //prints undefined
var a = 5;