В предыдущем посте мы говорили о подъеме переменных. Теперь мы рассмотрим подъем функций в JavaScript.
В JavaScript существует два основных типа функций —
- Объявления функций
- функциональные выражения
В этой заметке мы разберемся, что такое хостинг функций, рассмотрев, как ведут себя объявления функций и выражения функций на этапе создания и выполнения.
**Подъемные объявления функций
Мы проанализируем приведенный ниже пример, чтобы понять, как поднимаются объявления функций.
В приведенном выше примере происходит следующее.
- На этапе создания движок javascript встречает клавиатуру функции, и поведение по умолчанию таково, что когда встречается объявление функции, оно поднимается в память вместе с полным телом функции.
- Когда начинается фаза выполнения и вызывается функция add, полное тело функции уже доступно в фазе выполнения, поэтому эта программа выводит 3.
**Подъем функциональных выражений
Способ поднятия функциональных выражений похож на то, как поднимаются переменные, поскольку функциональные выражения — это просто присвоение анонимной функции переменной, чтобы впоследствии мы могли выполнить ее, обратившись к имени переменной.
Из приведенных выше примеров можно сделать вывод, что подъем функциональных выражений происходит так же, как и подъем переменных.
- В первом примере мы получаем ошибку
add is not a function
, так как переменная add была помещена в память со значениемundefined
, поэтому движок Js Engine ожидает, что add будет неопределенной, а не функцией, поэтому он выдает ошибку, если мы обратимся к ней до инициализации. - Во втором примере я заменил
var
наlet
, и он снова выдает ошибку, так как объявления let/const предоставляют память только на этапе создания, но не значение, что приводит к ошибкеcannot access 'add' before initialisation
. - Третий пример выводит ожидаемый результат, так как мы обращаемся к переменной add только после ее инициализации в программе out, поэтому переменная add инициализируется анонимной функцией и при ее вызове мы получаем результат 3.