Navngitte funksjonsuttrykk i JavaScript

La oss si at vi har et funksjonsuttrykk som dette:

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

test(); // vil skrive ut '!'

La oss gi funksjonen vår navnet func:

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

test();

Som du allerede vet, kan man ikke få tilgang til funksjonen via dette navnet:

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

test(); // vil skrive ut '!'
func(); // vil gi en feil

Hvorfor gi funksjonen et navn hvis det ikke vil være tilgjengelig? Poenget er at dette navnet vil være utilgjengelig utenfor funksjonen, men tilgjengelig inni denne funksjonen.

La oss sjekke:

javascriptlet test = function func() {
  console.log(func); // funksjonen vil skrive ut sin egen kildekode
};

test(); // kaller funksjonen

La oss kalle funksjonen vår inni seg selv:

javascriptlet test = function func() {
  console.log('!'); // skriver ut '!'
  func(); // kaller oss selv
};

test();

Hvis du kjører denne koden, vil det skrives ut et uendelig antall utskrifter til konsollen.

Faktisk kan funksjonen vår kalles innenfor seg selv ikke bare som func, men også som test:

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

test();

Hva er forskjellen? Forskjellen er at navnet test bare er en variabel. I prosessen med å kjøre skriptet kan funksjonen vår bli tildelt en annen variabel eller sendt som en parameter - i så fall kan forbindelsen mellom variabelen test og funksjonen forsvinne.

Navnet func derimot er hardkoblet til funksjonen spesielt for å gjøre det mulig å referere til funksjonen vår innenfor seg selv.

Slike Function Expression med funksjonsnavn kalles navngitte funksjonsuttrykk.