Nyanser av funksjonsuttrykk i JavaScript
Navnet Function Expression er ikke gitt uten grunn. Det betyr virkelig det - at slike funksjoner er en del av et eller annet uttrykk.
For eksempel kan vi legge sammen en streng og en navnløs funksjon:
let str = 'str' + function() {return 3;};
console.log(str); // vil skrive ut 'strfunction() {return 3;}'
Hvorfor ser vi et så merkelig resultat,
og ikke tallet 3? Fordi det andre leddet
- ikke er resultatet av funksjonen, men dens kildekode
(vi har jo ikke kalt på denne funksjonen, vi har bare
skrevet den).
Det vil si at navnet funksjonsuttrykk betyr at en slik funksjon deltar i et eller annet uttrykk.
Tilordning til en variabel er også et uttrykk:
let func = function() {
console.log('!');
};
Man kan for eksempel også sende funksjonen
som en parameter til console.log, og den vil skrive ut
dens kildekode til konsollen - dette vil også
regnes som et uttrykk:
console.log(function() {return 3;});
Hvorfor dette er viktig: fordi forskjellen mellom Function Declaration og Function Expression ikke er at den første funksjonen opprettes med et navn, mens den andre fra starten ikke har noe navn. Det er ikke slik.
Eksempel. Her har vi en funksjon uten navn, men som ikke deltar i noe uttrykk (det vilkår si at det ikke utføres noen handlinger med den, for å si det enkelt):
/*
Denne funksjonen vil være en Function Declaration,
men med en syntaksfeil:
*/
function() {
console.log('!');
}
En slik kode vil gi en feil! Hvorfor: siden funksjonen ikke deltar i noe uttrykk, regner nettleseren den som en Function Declaration, men finner ikke dens navn og gir en feil.
For at feilen skal forsvinne, må vi tvinge funksjonen
til å bli en del av et uttrykk. For eksempel,
skriver vi operasjonen + foran den:
+function() { // slik kode er korrekt
console.log('!');
};
Hvordan dette fungerer: i seg selv gjør operasjonen +
ingenting, det er det samme som å skrive
tallet +3 i stedet for tallet 3 - tillatt,
men endrer ingenting.
Men i tilfellet med en funksjon - endrer det. Nå er vår funksjon ikke bare skrevet, den deltar i et uttrykk. Derfor vil det ikke være noen feil nå. Resultatet av å kjøre funksjonen vil heller ikke være der, ettersom vi bare skrev den, men ikke kalte den.
I stedet for + kan man skrive hva som helst.
For eksempel:
-function() { // slik kode er korrekt
console.log('!');
};
!function() { // slik kode er korrekt
console.log('!');
};
Man kan også sette funksjonen vår i parenteser, i dette tilfellet vil den også bli et funksjonsuttrykk:
(function() { // slik kode er korrekt
console.log('!');
});
Bestem om den presenterte funksjonen er Function Declaration eller Function Expression:
function func() {
console.log('!');
}
Bestem om den presenterte funksjonen er Function Declaration eller Function Expression:
let func = function() {
console.log('!');
}
Bestem om den presenterte funksjonen er Function Declaration eller Function Expression:
+function() {
console.log('!');
}
Bestem om den presenterte funksjonen er Function Declaration eller Function Expression:
!function func() {
console.log('!');
}
Bestem om den presenterte funksjonen er Function Declaration eller Function Expression:
-function func() {
console.log('!');
}
Bestem om den presenterte funksjonen er Function Declaration eller Function Expression:
1 + function func() {
console.log('!');
}
Bestem om den presenterte funksjonen er Function Declaration eller Function Expression:
(function func() {
console.log('!');
})
Bestem om den presenterte funksjonen er Function Declaration eller Function Expression:
console.log(
function() {
console.log('!');
}
);