Я слышал, что доступ к значениям let
и const
значениям до их инициализации может вызвать ошибку ReferenceError
из-за того, что называется временной мертвой зоной .
Что такое временная мертвая зона, как она связана с прицелом и подъемом и в каких ситуациях встречается?
javascript
ecmascript-6
const
let
Joews
источник
источник
Ответы:
let
иconst
имеют два основных отличия отvar
:var
до его объявления дает результатundefined
; доступ к alet
или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
), но есть период между вводом и объем объявляется , где они не могут быть доступны. Этот период является временной мертвой зоной (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 и «Temporal Dead Zone» (TDZ) in Depth .
источник
let foo
in a block заставляет его поднять и объявить в верхней части этого блока. Строка,let foo
вызывающая его инициализацию. Иfoo = xyz
заставляет его присвоить значение.Грузоподъемные:
let
,const
,var
все прибудете водрузили процесс.(что означает, что они поднимаются выше и объявляют в верхней части области видимости.)
Инициализация:
var
пройти также начальный процесс и получить начальное значениеundefined
.let
,const
не пошел бросать начальный процесс, поэтому их значения все еще недоступны, хотя они уже объявлены. что их вtemporal dead zone
Итак, вкратце:
источник
В случае переменных 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;
источник
undefined
и5
). Declaratation изvar a
поднят, то inifialisation код Настраиваетa
5 не.