Elnevezett funkcionális kifejezések a JavaScriptben

Tegyük fel, hogy van egy ilyen funkcionális kifejezésünk:

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

test(); // kiírja '!'

Adjunk nevet a függvényünknek func:

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

test();

Mint már tudjátok, ezen a néven nem lehet hozzáférni a függvényhez:

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

test(); // kiírja '!'
func(); // hibát ad

Miért adjunk nevet a függvénynek, ha az nem lesz elérhető? Az a helyzet, hogy ez a név a függvényen kívülről nem lesz elérhető, de a függvényen belülről igen.

Vizsgáljuk meg:

javascriptlet test = function func() {
  console.log(func); // a függvény kiírja a saját forráskódját
};

test(); // meghívjuk a függvényt

Hívjuk meg a függvényünket önmagán belül:

javascriptlet test = function func() {
  console.log('!'); // kiírjuk '!'
  func(); // meghívjuk önmagunkat
};

test();

Ha ezt a kódot futtatjuk, akkor a konzolba végtelen számú üzenet kerül kiírásra.

Valójában a függvényünk önmagán belül nem csak func néven hívható meg, hanem test néven is:

javascriptlet test = function func() {
  console.log('!');
  test(); // meghívjuk önmagunkat
};

test();

Mi a különbség? A különbség az, hogy a test név csupán egy változó. A szkript futása során a függvényünk lehet, hogy egy másik változóba kerül, vagy paraméterként adódik át - ebben az esetben a test változó és a függvény közötti kapcsolat megszűnhet.

Az func név viszont szigorúan a függvényhez van kötve, kifejezetten azért, hogy a függvényen belülről lehessen hivatkozni rá.

Az ilyen, függvénynévvel rendelkező Function Expression-öket elnevezett funkcionális kifejezéseknek nevezzük.