Статья, которая объясняет одну из самых важных тем — подъем, как работает подъем для переменных, объявления функций и выражения функций в JavaScript.

Поднятие — это процесс, при котором интерпретатор перемещает объявление функций или переменных в верхнюю часть их области видимости перед выполнением кода.

Переменный подъем

1. Вар

переменные, объявленные с помощью var, поднимаются наверх своей текущей области действия объемлющей функции.

Неопределенное значение будет возвращено, если переменные используются до их объявления.

  • Переменная outer, объявленная с помощью var, поднимается наверх области действия функции.
  • Переменной outer присваивается значение undefined; вот почему мы получаем undefined как значение переменной outer в первом операторе консоли.
  • После этого outer присваивается значение 34, что видно из следующего оператора консоли if-block.
  • Затем outer присваивается значение 56, которое возвращается в операторе консоли после обоих операторов if.
  • Наконец, переменная outer объявляется и инициализируется со значением 45, которое возвращается в последнем операторе консоли.

2. Пусть или константа

переменные, объявленные с помощью let/const, также поднимаютсяв верхнюю часть своей текущей области охвата блока.

Однако переменные находятся во временной мертвой зоне от начала области охвата их блока до объявления переменной.

Следовательно, Ошибка ссылки будет вызвана, если на переменные ссылаются до их объявления.

  • Переменная inner будет находиться во временной мертвой зоне (TDZ) до своего объявления.
  • Доступ к переменной inner был осуществлен до ее объявления, что привело к ошибке ссылки.

Объявление функции

Объявление функции определяет функцию с именем функции и предоставленными параметрами.

Объявление функции всегда поднимается наверх своей области видимости. Подъем позволяет вызывать функцию из любой точки текущей или внутренней области.

Функциональные выражения

Выражения функций аналогичны объявлениям функций, но хранятся в переменных.

  • Функциональные выражения, объявленные с помощью var, поднимаются наверх своей области видимости.
  • Однако им присваивается значение undefined. Следовательно, TypeError будет сгенерирован, если выражение функции будет вызвано до его объявления.

  • Функциональные выражения, объявленные с помощью let/const, поднимаются наверх своей области видимости.
  • Однако, как упоминалось ранее, сама переменная будет находиться во временной мертвой зоне (TDZ) до ее объявления. Поэтому функциональное выражение не может вызываться перед объявлением переменной.

Функциональное выражение checkFlag было вызвано до фактического объявления, что привело к ошибке ссылки.