Namngivna funktionsuttryck i JavaScript
Låt oss säga att vi har ett funktionsuttryck som ser ut så här:
let test = function() {
console.log('!');
};
test(); // skriver ut '!'
Låt oss ge vår funktion namnet func:
let test = function func() {
console.log('!');
};
test();
Som du redan vet går det inte att komma åt funktionen via detta namn:
let test = function func() {
console.log('!');
};
test(); // skriver ut '!'
func(); // ger ett fel
Varför ge funktionen ett namn om det inte kommer att vara tillgängligt? Anledningen är att detta namn inte kommer att vara tillgängligt utanför funktionen, men tillgängligt inuti funktionen.
Låt oss kolla:
let test = function func() {
console.log(func); // funktionen kommer att skriva ut sin egen källkod
};
test(); // anropar funktionen
Låt oss anropa vår funktion inuti sig själv:
let test = function func() {
console.log('!'); // skriver ut '!'
func(); // anropar oss själva
};
test();
Om du kör denna kod kommer ett oändligt antal utskrifter att visas i konsolen.
Faktum är att vår funktion kan anropas
inuti sig själv inte bara som func, utan
också som test:
let test = function func() {
console.log('!');
test(); // anropar oss själva
};
test();
Vad är då skillnaden? Skillnaden är att namnet
test bara är en variabel. Under skriptets
arbete kan vår funktion skrivas till
en annan variabel eller skickas som en parameter
- i detta fall kan kopplingen mellan variabeln test
och funktionen försvinna.
Namnet func är däremot hårt knutet till funktionen
specifikt för att möjliggöra åtkomst
till vår funktion inuti sig själv.
Sådana Function Expression med funktionsnamn kallas namngivna funktionsuttryck.