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

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

`let test = function() { console.log('!'); }; test(); // выведет '!'`

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

`let test = function func() { console.log('!'); }; test();`

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

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

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

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

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

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

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

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

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

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

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

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

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

← →
↑
en ru