Nimetetyt funktionaaliset lausekkeet JavaScriptissä

Oletetaan, että meillä on tällainen funktionaalinen lauseke:

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

test(); // tulostaa '!'

Annetaan funktiollemme nimi func:

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

test();

Kuten jo tiedät, tällä nimellä ei voi viitata funktioon:

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

test(); // tulostaa '!'
func(); // aiheuttaa virheen

Miksi antaa funktiolle nimi, jos sitä ei ole saatavilla ulkopuolelta? Asia on siinä, että tämä nimi on saatavilla funktion sisällä, mutta ei sen ulkopuolella.

Testataan tätä:

javascriptlet test = function func() {
  console.log(func); // funktio tulostaa oman lähdekoodinsa
};

test(); // kutsutaan funktiota

Kutsutaan funktiotamme sen sisällä:

javascriptlet test = function func() {
  console.log('!'); // tulostetaan '!'
  func(); // kutsutaan itseämme
};

test();

Jos tämä koodi ajetaan, konsoliin tulostuu loputon määrä tulostuksia.

Itse asiassa funktiomme voidaan kutsua sisäisesti paitsi nimellä func, myös nimellä test:

javascriptlet test = function func() {
  console.log('!');
  test(); // kutsutaan itseämme
};

test();

Mikä ero on? Erona on, että nimi test on vain muuttuja. Skriptin suorituksen aikana funktiomme voi tallentua toiseen muuttujaan tai välittyä parametrina - tässä tapauksessa yhteys muuttujan test ja funktion välillä voi katketa.

Nimi func on kuitenkin tiukasti sidottu funktioon nimenomaan siksi, että funktioon voidaan viitata sen sisällä.

Tällaisia Function Expression -lausekkeita, joissa on funktion nimi, kutsutaan nimetyiksi funktionaalisiksi lausekkeiksi.