Именованные функциональные выражения
Итак, на сегодня мы знаем 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
Принципиальной разницы между третьим и четвертым вариантом нет, так как в первом случае мы выполняем выражение, которое определяет и сразу же исполняет функцию, а во втором случае выполняется выражение, определяющее функцию, которая затем будет выполнена.