Pojmenované funkční výrazy v JavaScriptu

Předpokládejme, že máme takový funkční výraz:

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

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

Pojďme naší funkci dát jméno func:

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

test();

Jak již víte, podle tohoto jména nelze k funkci přistoupit:

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

test(); // vypíše '!'
func(); // vrátí chybu

Proč tedy dávat funkci jméno, pokud nebude přístupné? Jde o to, že toto jméno bude nepřístupné zvenčí funkce, ale přístupné uvnitř této funkce.

Pojďme to ověřit:

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

test(); // voláme funkci

Pojďme zavolat naši funkci uvnitř ní samotné:

javascriptlet test = function func() {
  console.log('!'); // vypíšeme '!'
  func(); // voláme sami sebe
};

test();

Pokud spustíte tento kód, bude se do konzole vypisovat nekonečné množství výpisů do konzole.

Ve skutečnosti může být naše funkce volána uvnitř sebe sama nejen jako func, ale i jako test:

javascriptlet test = function func() {
  console.log('!');
  test(); // voláme sami sebe
};

test();

V čem je tedy rozdíl? Rozdíl je v tom, že jméno test - je pouze proměnná. Během práce skriptu se naše funkce může zapsat do jiné proměnné nebo předat parametrem - v tomto případě může souvislost mezi proměnnou test a funkcí zmizet.

Jméno func je naopak pevně svázáno s funkcí specifikálně proto, aby bylo možné přistoupit k naší funkci uvnitř ní samotné.

Takové Function Expression s názvem funkce se nazývají pojmenované funkční výrazy.