Expresii funcționale denumite în JavaScript

Să presupunem că avem următoarea expresie funcțională:

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

test(); // va afișa '!'

Să dăm funcției noastre numele func:

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

test();

După cum știți deja, nu vă puteți referi la funcție după acest nume:

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

test(); // va afișa '!'
func(); // va arunca o eroare

De ce să dăm un nume funcției dacă acesta nu va fi accesibil? Ideea este că acest nume va fi inaccesibil din afara funcției, dar accesibil în interiorul acestei funcții.

Să verificăm:

javascriptlet test = function func() {
  console.log(func); // funcția va afișa propriul său cod sursă
};

test(); // apelăm funcția

Să autoapelăm funcția noastră în interiorul ei însăși:

javascriptlet test = function func() {
  console.log('!'); // afișăm '!'
  func(); // ne autoapelăm
};

test();

Dacă executați acest cod, în consolă va fi afișat un număr infinit de mesaje.

De fapt, funcția noastră poate fi apelată în interiorul ei însăși nu doar ca func, ci și ca test:

javascriptlet test = function func() {
  console.log('!');
  test(); // ne autoapelăm
};

test();

Care este diferența? Diferența este că numele test este doar o variabilă. În timpul execuției scriptului, funcția noastră poate fi atribuită unei alte variabile sau transmisă ca parametru - în acest caz, legătura dintre variabila test și funcție poate fi pierdută.

Numele func este însă legat rigid de funcție special pentru a ne putea referi la funcția noastră în interiorul ei însăși.

Astfel de Expresii Funcționale cu nume de funcție se numesc expresii funcționale denumite.