Именовани функционални изрази в JavaScript

Да предположим, че имаме следния функционален израз:

javascriptlet test = function() {
  console.log('!');
};

test(); // ще изведе '!'

Нека дадем име func на нашата функция:

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

test();

Както вече знаете, не може да се достъпи до функцията по това име:

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

test(); // ще изведе '!'
func(); // ще даде грешка

Тогава защо да даваме име на функция, ако то няма да бъде достъпно? Работата е там, че това име ще бъде недостъпно отвън на функцията, но достъпно вътре в самата функция.

Нека проверим:

javascriptlet test = function func() {
  console.log(func); // функцията ще изведе собствения си изходен код
};

test(); // извикваме функцията

Нека извикаме нашата функция вътре в самата нея:

javascriptlet test = function func() {
  console.log('!'); // извеждаме '!'
  func(); // извикваме себе си
};

test();

Ако стартирате този код, в конзолата ще се извежда безкрайно много съобщения.

Всъщност нашата функция може да бъде извикана вътре в себе си не само като func, но и като test:

javascriptlet test = function func() {
  console.log('!');
  test(); // извикваме себе си
};

test();

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

Името func е строго свързано с функцията специално за да може да се достъпи до нашата функция вътре в самата нея.

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