Nyanser av funktionsuttryck i JavaScript
Namnet Function Expression är inte givet utan anledning. Det betyder verkligen det - att sådana funktioner är en del av något uttryck.
Till exempel kan vi lägga till någon sträng och en namnlös funktion:
let str = 'str' + function() {return 3;};
console.log(str); // visar 'strfunction() {return 3;}'
Varför ser vi ett sådant konstigt resultat,
och inte siffran 3? Eftersom den andra termen
är inte resultatet av funktionens arbete, utan dess ursprungliga
kod (vi anropade trots aldrig denna funktion, vi bara
skrev den).
Det vill säga, namnet funktionsuttryck betyder att en sådan funktion tar del i något uttryck.
Tilldelning till en variabel är också ett uttryck:
let func = function() {
console.log('!');
};
Man kan också, till exempel, skicka en funktion
som en parameter till console.log och den kommer att visa
dess källkod i konsolen - det kommer också att
räknas som ett uttryck:
console.log(function() {return 3;});
Varför är detta viktigt: för att skillnaden mellan Function Declaration och Function Expression är inte alls att den första funktionen skapas med ett namn, och den andra initialt inte har något namn. Det är inte så.
Exempel. Här har vi en funktion utan namn, men som samtidigt inte deltar i något uttryck (det vill säga, inga åtgärder utförs med den, enkelt uttryckt):
/*
Denna funktion kommer att vara en Function Declaration,
men med ett syntaktiskt fel:
*/
function() {
console.log('!');
}
Sådan kod kommer generellt att ge ett fel! Varför: eftersom funktionen inte deltar i något uttryck, anser webbläsaren att den är en Function Declaration, men hittar inte dess namn och ger ett fel.
För att felet ska försvinna måste man göra så att funktionen
blir en del av något uttryck. Till exempel,
skriver vi operationen + före den:
+function() { // sådan kod är korrekt
console.log('!');
};
Hur detta fungerar: själva operationen +
gör ingenting, det är som att skriva
istället för siffran 3 siffran +3 - tillåtet,
men ändrar ingenting.
Men i fallet med en funktion - ändrar det. Nu är vår funktion inte bara skriven, utan deltar i ett uttryck. Därför blir det inget fel nu. Resultatet av att exekvera funktionen kommer inte heller, eftersom vi bara skrev den, men inte anropade den.
Istället för + kan man skriva vad som helst.
Till exempel:
-function() { // sådan kod är korrekt
console.log('!');
};
!function() { // sådan kod är korrekt
console.log('!');
};
Man kan också sätta vår funktion inom runda parenteser, i det här fallet blir den också ett funktionsuttryck:
(function() { // sådan kod är korrekt
console.log('!');
});
Avgör om den presenterade funktionen är Function Declaration eller Function Expression:
function func() {
console.log('!');
}
Avgör om den presenterade funktionen är Function Declaration eller Function Expression:
let func = function() {
console.log('!');
}
Avgör om den presenterade funktionen är Function Declaration eller Function Expression:
+function() {
console.log('!');
}
Avgör om den presenterade funktionen är Function Declaration eller Function Expression:
!function func() {
console.log('!');
}
Avgör om den presenterade funktionen är Function Declaration eller Function Expression:
-function func() {
console.log('!');
}
Avgör om den presenterade funktionen är Function Declaration eller Function Expression:
1 + function func() {
console.log('!');
}
Avgör om den presenterade funktionen är Function Declaration eller Function Expression:
(function func() {
console.log('!');
})
Avgör om den presenterade funktionen är Function Declaration eller Function Expression:
console.log(
function() {
console.log('!');
}
);