Если вы какое-то время работали с JavaScript, вы, вероятно, слышали термин «подъем». Фактически, для интервьюеров это одна из концепций, о которых они любят спрашивать, потому что она показывает уровень понимания JavaScript кандидатом. Однако что именно означает подъем и как это влияет на ваш код? В этой статье я расскажу вам, что вам нужно знать об этом и о том, как это влияет на ваш код.

Прежде всего, давайте посмотрим на лингвистическое значение этого термина, прежде чем мы перейдем к его техническому использованию. Подъем просто используется для обозначения акта подъема или вытягивания чего-либо, обычно с использованием веревок или шкивов. Вы услышите такие утверждения, как «она закинула свой рюкзак на плечо», «подняла флаг», «груз был поднят на корабль» и т. д. Другие слова для подъема включают подъем или подъем.

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

Например, рассмотрим следующий код:

Строка var x = 10 содержит два действия:

  1. Объявление переменной «var».
  2. Присвоение переменной «=».

Несмотря на то, что переменная x не объявлена ​​до второй строки, код все равно будет работать из-за подъема. Объявление для x автоматически перемещается в начало содержащей функции или скрипта. Присваивание всегда работает в том месте, где оно появляется, хотя объявление обрабатывается в начале выполнения функции («поднимается»). Таким образом, код в основном работает следующим образом:

Интересно, что следует отметить, что подъем влияет только на объявления, а не на присваивания или инициализации. В приведенном выше примере значение x не определено, когда оно регистрируется в консоли, поскольку присвоение 10 еще не произошло.

Чтобы лучше понять это, давайте посмотрим, как это поведение проявляется в функциях.

В приведенном выше примере вы заметите, что даже когда функция была вызвана до ее объявления, код по-прежнему работал нормально и выдавал правильное выражение при регистрации. Независимо от того, объявлена ​​ли функция до вызова или наоборот, поведение остается прежним. Интерпретатор JavaScript захватил объявление функции и поместил его в верхнюю часть области видимости перед ее выполнением. Как если бы код выглядел так:

С другой стороны, давайте рассмотрим, как работает подъем с анонимной функцией или функцией, назначенной переменной. Пример этого показан в примере ниже:

Как видите, приведенный выше код выдал ошибку. Подъем не поддерживает присваивание, что является объяснением, упомянутым ранее, почему это так. Выражение, известное как «немедленно вызываемые функциональные выражения», представляет собой инновационный подход к выполнению анонимной функции (сокращенно IIFE).

Не менее важными для поведения хостинга в переменных JavaScript являются два ключевых слова «let» и «const», которые также используются для объявления переменных, таких как «var». В отличие от своих аналогов «var», значение переменной, объявленной с помощью «let» или «const», не поднимается. Если вы попытаетесь получить доступ к значению любого из них до того, как оно будет объявлено, вы получите исключение ReferenceError, как показано на изображениях ниже.

При использовании подъема одной из распространенных ошибок, которую совершают многие разработчики, является предположение, что значение переменной всегда инициализируется как неопределенное. Однако это верно только для переменных, в объявлении которых есть ключевое слово «var». Любая попытка доступа к переменной, которая была объявлена ​​с помощью «let» или «const» до выполнения присваивания, приведет к ошибке ReferenceError. Современные лучшие практики кодирования настоятельно рекомендуют избегать использования «var» в пользу «let» и «const», потому что они обеспечивают лучшую защиту от непреднамеренных или случайных изменений ваших переменных.

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