Pomenované funkčné výrazy v JavaScripte

Majme takýto funkčný výraz:

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

test(); // vypíše '!'

Dajme našej funkcii meno func:

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

test();

Ako už viete, pod týmto menom nie je prístup k funkcii:

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

test(); // vypíše '!'
func(); // vyhodí chybu

Načo však dávať funkcii meno, ak nebude dostupné? Vec sa má tak, že toto meno bude nedostupné zvonku funkcie, ale dostupné vnútri tejto funkcie.

Skontrolujme to:

javascriptlet test = function func() {
  console.log(func); // funkcia vypíše svoj vlastný zdrojový kód
};

test(); // voláme funkciu

Zavolajme našu funkciu vnútri nej samotnej:

javascriptlet test = function func() {
  console.log('!'); // vypíšeme '!'
  func(); // voláme samých seba
};

test();

Ak spustíte tento kód, do konzoly sa bude vypisovať nekonečné množstvo výpisov do konzoly.

Naša funkcia môže byť volaná vnútri seba samého nielen ako func, ale aj ako test:

javascriptlet test = function func() {
  console.log('!');
  test(); // voláme samých seba
};

test();

V čom je však rozdiel? Rozdiel je v tom, že meno test - je len premenná. Počas činnosti skriptu sa naša funkcia môže zapísať do inej premennej alebo odovzdať ako parameter - v tomto prípade môže spojenie medzi premennou test a funkciou zmiznúť.

Meno func je naopak pevne naviazané na funkciu práve preto, aby bolo možné odkázať na našu funkciu vnútri nej samotnej.

Takéto Function Expression s menom funkcie sa nazývajú pomenované funkčné výrazy.