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

Пусть у нас есть вот такое функциональное выражение:

let test = function() { alert('!'); }; test(); // выведет '!'

Давайте нашей функции дадим имя func:

let test = function func() { alert('!'); }; test();

Как вы уже знаете, по этому имени не обратиться к функции:

let test = function func() { alert('!'); }; test(); // выведет '!' func(); //!! выдаст ошибку

Зачем же давать имя функции, если оно не будет доступно? Дело в том, что это имя будет недоступно снаружи функции, но доступно внутри этой функции.

Давайте проверим:

let test = function func() { alert(func); // функция выведет свой же исходный код }; test(); // вызываем функцию

Давайте вызовем нашу функцию внутри нее самой:

let test = function func() { alert('!'); // выводим '!' func(); // вызываем сами себя }; test();

Если запустить данный код, то на экран будет выводится бесконечное количество алертов.

На самом деле наша функция может быть вызвана внутри себя не только как func, но и как test:

let test = function func() { alert('!'); test(); // вызываем сами себя }; test();

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

Имя func же жестко привязано к функции специально для того, чтобы можно было обратиться к нашей функции внутри нее самой.

Такие Function Expression с именем функции называются именованными функциональными выражениями.