Imenovani funkcijski izrazi v JavaScriptu

Recimo, da imamo takšen funkcijski izraz:

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

test(); // izpiše '!'

Dajmo naši funkciji ime func:

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

test();

Kot že veste, po tem imenu ni mogoče dostopati do funkcije:

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

test(); // izpiše '!'
func(); // vrne napako

Zakaj pa potem dajati ime funkciji, če ne bo dostopno? Bistvo je v tem, da tega imena ne bo mogoče dostopati zunaj funkcije, vendar je dostopno znotraj te funkcije.

Preverimo:

javascriptlet test = function func() {
  console.log(func); // funkcija bo izpisala svojo izvorno kodo
};

test(); // kličemo funkcijo

Pokličimo našo funkcijo znotraj nje same:

javascriptlet test = function func() {
  console.log('!'); // izpišemo '!'
  func(); // kličemo same sebe
};

test();

Če zaženete to kodo, se bo v konzolo izpisovala neskončna količina izpisov v konzolo.

Pravzaprav je naša funkcija lahko poklicana znotraj sebe ne le kot func, temveč tudi kot test:

javascriptlet test = function func() {
  console.log('!');
  test(); // kličemo same sebe
};

test();

V čem je razlika? Razlika je v tem, da je ime test le spremenljivka. V procesu delovanja skripta se lahko naša funkcija zapiše v drugo spremenljivko ali posreduje kot parameter - v tem primeru lahko povezava med spremenljivko test in funkcijo izgine.

Ime func je togo vezano na funkcijo specifično zato, da se lahko dostopimo do naše funkcije znotraj nje same.

Takšni Function Expression z imenom funkcije se imenujejo imenovani funkcijski izrazi.