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

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

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

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 подняты (как 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;
Другие вопросы по тегам