Pavadinti funkciniai išsireiškimai JavaScript

Tarkime, kad turime tokį funkcinį išsireiškimą:

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

test(); // išves '!'

Duokime mūsų funkcijai pavadinimą func:

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

test();

Kaip jau žinote, pagal šį pavadinimą neįmanoma kreiptis į funkciją:

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

test(); // išves '!'
func(); // išmes klaidą

Kam tada duoti funkcijai pavadinimą, jei ji nebus prieinama? Esmė ta, kad šis pavadinimas bus neprieinamas iš funkcijos išorės, bet prieinamas jos viduje.

Patikrinkime:

javascriptlet test = function func() {
  console.log(func); // funkcija išves savo paties pradinį kodą
};

test(); // iškviečiame funkciją

Iškvieskime mūsų funkciją jos viduje:

javascriptlet test = function func() {
  console.log('!'); // išvedame '!'
  func(); // iškviečiame save patį
};

test();

Jei paleisite šį kodą, į konsolę bus išvedama begalinis kiekis išvedimų į konsolę.

Tiesą sakant, mūsų funkcija gali būti iškviesta savo viduje ne tik kaip func, bet ir kaip test:

javascriptlet test = function func() {
  console.log('!');
  test(); // iškviečiame save patį
};

test();

Koks skirtumas? Skirtumas tas, kad pavadinimas test - tai tik kintamasis. Proceso metu mūsų funkcija gali būti įrašyta į kitą kintamąjį arba perduota parametru - tokiu atveju ryšys tarp kintamojo test ir funkcijos gali išnykti.

Pavadinimas func yra standžiai pririštas prie funkcijos specialiai tam, kad būtų galima kreiptis į mūsų funkciją jos viduje.

Tokie Function Expression su funkcijos pavadinimu vadinami pavadintais funkciniais išsireiškimais.