Именованные функциональные выражения


Итак, на сегодня мы знаем Function Declaration и Function Expression.
Первые - обыкновенные функции

function factorial (n) { ... }

Вторые - именованные

var factorial = function (n) { ... };

Отличие между ними:
- время создания: Function Declaration создаются до выполнения первой строчки кода, а Function Expression по ходу выполнения, в момент, когда интерпретатор дойдёт до данной строки кода;
- время вызова - Function Declaration можно вызвать до того, как она была объявлена, а Function Expression- нельзя;
- условное объявление с if возможно только для Function Expression

и ещё после Function Expression ставится точка с запятой, а после Function Declaration - нет

Сегодня мы познакомимся с именованным функциональным выражением - Named Function Expression

var f = function factorial (n) { ... };

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

Зачем такая особенность нужна?
В первую очередь для рекурсивных функций, которые вызываются из самой функции.
Внутреннее имя позволяет функции надёжно обращаться к самой себе, где бы она ни находилась.

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

Здесь новое 0 функции в круглых скобках, которые выполняются сразу без  дополнительного вызова
Декларируя функцию, мы не можем выполнить её сразу же, однако, обернув декларацию функции в круглые скобки — это становится возможно. Оператор группировки выражается круглыми скобками, и в данном случае он превращает декларацию функции в функциональное выражение.


function foo() { return 1; } // undefined 
function foo() { return 1; }(); // Uncaught SyntaxError: Expected () to start arrow function, but got '}' instead of '=>'
(function foo() { return 1; }()) // 1
(function foo() { return 1; })() // 1

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