Контекст выполнения всегда содержит три части: переменную среду, цепочку областей видимости в текущем контексте и ключевое слово this. Давайте подробнее рассмотрим переменную среду и то, как на самом деле переменные создаются в JavaScript.

Подъем в JavaScript

Поднятие – это механизм, который делает некоторые типы переменных доступными/используемыми в коде до того, как они будут фактически объявлены в коде.

Перед выполнением код сканируется на наличие объявлений переменных, и для каждой переменной создается новое свойство в объекте среды переменных. Это происходит на этапе создания контекста выполнения.

Подъем не работает одинаково для всех типов переменных. Давайте проанализируем, как работает подъем с объявлениями функций, переменными var, переменными let и const, а также функциональными выражениями и стрелками.

Технически переменные let и const поднимаются, но их значение установлено как неинициализированное, как будто подъема вообще не происходит. Вместо этого мы говорим, что эти переменные помещены в так называемую временную мертвую зону или TDZ, что делает невозможным доступ к переменным между началом области действия и место, где объявлены переменные.

Временная мертвая зона, let и const

TDZ — это область области видимости, в которой переменная определена, но не может использоваться каким-либо образом. Как будто переменной даже не существует.

Если мы попытаемся получить доступ к переменной в TDZ, в данном случае job, мы получим ошибку ссылки, говорящую о том, что мы не можем получить доступ к переменной до инициализации.

Если мы попытаемся получить доступ к переменной, которая на самом деле даже не была создана, в данном случае x, мы получим другое сообщение об ошибке, в котором говорится, что переменная не определена.

Это означает, что job на самом деле находится в TDZ, где она неинициализирована, но движок знает, что в конечном итоге он будет инициализирован, потому что движок уже прочитал код ранее и установил переменную job в среде переменных как неинициализированную. Затем, когда выполнение достигает строки, где объявлена ​​переменная, она удаляется из TDZ, и ее можно безопасно использовать.

По сути, каждая переменная let и const получает свою собственную временную мертвую зону, которая начинается в начале области до строки, в которой она определена. Эти переменные безопасно использовать только после TDZ.

Почему ТДЗ и Подъем?

Тогда зачем TDZ необходим в JavaScript?

Основная причина, по которой TDZ был введен в ES6, заключается в том, что он упрощает избегание и обнаружение ошибок. Доступ к переменным до объявления, если переменная установлена ​​в значение undefined, является плохой практикой, и ее следует избегать.

Во-вторых, TDZ заставляет константные переменные работать так, как они должны. Мы не можем переназначать константные переменные, поэтому невозможно сначала установить для них значение undefined, а затем присвоить их реальное значение. Const никогда не следует переназначать. Он назначается только тогда, когда выполнение действительно достигает объявления.

Тогда действительно ли подъем необходим в JavaScript?

Поднятие в основном реализовано в JavaScript, чтобы заставить нас использовать объявления функций до их использования. Это важно для некоторых методов программирования, таких как взаимная рекурсия. Кроме того, некоторые люди также думают, что это делает код более читабельным.

Причина, по которой подъем работает для объявлений var, заключается в том, что в то время это был единственный способ реализовать подъем. Таким образом, подъем переменных var — это просто побочный продукт подъема функций. Никто не знал, что JavaScript станет таким огромным языком программирования, каким он является сегодня. Поскольку сейчас мы не можем удалить эту функцию из языка, мы просто используем let и const, чтобы обойти это.

Ссылка