Imenovani funkcionalni izrazi u JavaScript-u

Neka imamo sledeći funkcionalni izraz:

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

test(); // ispisace '!'

Hajde da damo ime func našoj funkciji:

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

test();

Kao što već znate, po ovom imenu se ne može pristupiti funkciji:

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

test(); // ispisace '!'
func(); // baciće grešku

Zašto onda dati ime funkciji, ako ono neće biti dostupno? Stvar je u tome što će ovo ime biti nedostupno spolja iz funkcije, ali dostupno unutar nje same.

Hajde da proverimo:

javascriptlet test = function func() {
  console.log(func); // funkcija će ispisati svoj sopstveni izvorni kod
};

test(); // pozivamo funkciju

Hajde da pozovemo našu funkciju unutar nje same:

javascriptlet test = function func() {
  console.log('!'); // ispisujemo '!'
  func(); // pozivamo sami sebe
};

test();

Ako pokrenete ovaj kod, u konzolu će se beskonačno mnogo puta ispisivati '!'.

Zapravo, naša funkcija može biti pozvana unutar sebe ne samo kao func, već i kao test:

javascriptlet test = function func() {
  console.log('!');
  test(); // pozivamo sami sebe
};

test();

U čemu je onda razlika? Razlika je u tome što je ime test samo promenljiva. U toku rada skripta, naša funkcija može biti upisana u drugu promenljivu ili prosleđena kao parametar - u tom slučaju veza između promenljive test i funkcije može nestati.

Ime func je, pak, čvrsto vezano za funkciju upravo zato da bi se moglo pristupiti našoj funkciji unutar nje same.

Ovakvi Function Expression sa imenom funkcije se nazivaju imenovanim funkcionalnim izrazima.