Именувани функционални изрази во 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 со име на функцијата се нарекуваат именувани функционални изрази.