Давайте начнем с нескольких простых примеров:

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

Объявление функции — это просто оператор, начинающийся со слова function.

  • Line 1 — это объявление функции, потому что оно начинается с ключевого слова function.
  • Важно помнить, что объявление функции является объявлением, поэтому код внутри не будет выполняться до тех пор, пока он не будет фактически вызван.
  • Line 13 — это то, что мы фактически вызываем объявление функции и выполняем код, хранящийся внутри.

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

Функциональное выражение — это просто функция, которая не начинается со слова function.

  • В JavaScript функции являются объектами первого класса, что означает, что они могут вести себя как объекты, и мы знаем, что можем назначать объекты переменным, поэтому мы можем делать то же самое с функциями!
  • Line 5 — это функциональное выражение, в котором мы присваиваем функцию имени переменной.
  • Важно также помнить, что здесь мы также присваиваем ссылку на функцию, точно так же, как и в объявлениях функций, мы все еще должны выполнять функцию.
  • Line 14 & 15 мы фактически вызываем функциональные выражения и выполняем код, хранящийся внутри.

Выражения именованных и анонимных функций

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

В серии книг «Вы не знаете Js» Кайла Симпсона он приводит следующие причины, по которым кто-то предпочитает именованные функциональные выражения, а не анонимные функциональные выражения.

  1. Надежная функция самореференции. например (если у вас есть функция рекурсии, вы не можете ссылаться на себя с помощью анонимной функции)
  2. Вы получаете гораздо больше трассировки стека, используя именованные функциональные выражения.
  3. Вы можете утверждать, что именованные функциональные выражения улучшают читабельность вашего кода.

Все это важные различия, которые имеют свои плюсы и минусы, вам решать, что вы предпочитаете, но важно знать, что функционально они будут работать одинаково.

Выражения функций и объявления функций

Итак, вы, вероятно, спросите: «Хорошо, круто, между ними есть семантические различия, но если это так, то почему меня это волнует». Что ж, спасибо за вопрос! Позвольте мне объяснить, чем они отличаются!

Function Declarations "подняты", а Function Expressions нет.

Я намеренно заключил термин Hoisted в кавычки, потому что это не обязательно подъем, который выполняет работу, но это популярный термин, придуманный сообществом JavaScript, поэтому на него стоит ссылаться. Hoisting — это отдельная тема, которую я не буду обсуждать здесь, но если вы хотите ознакомиться с ней, я дал ссылку ниже.



Как и все остальное, это лучше всего понять на примерах

  • Обратите внимание на нижнюю часть программы Line 15, как выглядит объявление функции hoisted. Это создает иллюзию, когда вы на самом деле пишете код, что вы можете вызвать функцию до того, как она будет определена.
  • Обратите внимание, что в нижней части программы Line 22 не hoisted, и он находится в том же месте, что и в верхней части программы Line 8. Поскольку это не hoisted, вы получаете ошибку ссылки при попытке вызвать его до его вызова (тот же результат был бы, если бы это было именованное функциональное выражение).

Таким образом, вывод здесь должен состоять в том, что разница между функциональными выражениями и объявлениями функций заключается в том, что объявления поднимаются, а выражения — нет. Это позволяет вам вызывать функцию до того, как она будет определена. Вот и все! Не так уж плохо, верно?

Вывод

резюме того, что мы узнали:

  1. Объявления функций — это операторы, начинающиеся с ключевого слова function.
  2. Функциональные выражения могут быть анонимными или именованными.
  3. Анонимные функциональные выражения более распространены, но у именованных функциональных выражений есть свои преимущества.
  4. Объявления функций поднимаются, пока