Navngivne funktionsudtryk i JavaScript

Lad os sige, at vi har et funktionsudtryk som dette:

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

test(); // vil udskrive '!'

Lad os give vores funktion navnet func:

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

test();

Som du allerede ved, kan man ikke tilgå funktionen via dette navn:

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

test(); // vil udskrive '!'
func(); // vil give en fejl

Hvorfor give funktionen et navn, hvis det ikke vil være tilgængeligt? Grunden er, at dette navn vil være utilgængeligt udefra funktionen, men tilgængeligt inde i funktionen.

Lad os tjekke:

javascriptlet test = function func() {
  console.log(func); // funktionen vil udskrive sin egen kildekode
};

test(); // kalder funktionen

Lad os kalde vores funktion inde i den selv:

javascriptlet test = function func() {
  console.log('!'); // udskriver '!'
  func(); // kalder os selv
};

test();

Hvis denne kode køres, vil der blive udskrevet et uendeligt antal beskeder til konsollen.

Faktisk kan vores funktion kaldes inde i sig selv ikke kun som func, men også som test:

javascriptlet test = function func() {
  console.log('!');
  test(); // kalder os selv
};

test();

Hvad er forskellen? Forskellen er, at navnet test blot er en variabel. I processen af scriptets udførelse kan vores funktion blive tildelt en anden variabel eller sendes som en parameter - i dette tilfælde kan forbindelsen mellem variablen test og funktionen gå tabt.

Navnet func derimod er hårdt bundet til funktionen specifikt med henblik på at kunne tilgå vores funktion inde i den selv.

Sådanne Function Expression med funktionens navn kaldes navngivne funktionsudtryk.