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