A funkcionális kifejezések árnyalatai a JavaScriptben
A Function Expression elnevezés nem véletlenül kapta ezt a nevet. Valóban azt jelenti, hogy az ilyen függvények részei valamilyen kifejezésnek.
Például összeadhatunk egy stringet és egy névtelen függvényt:
let str = 'str' + function() {return 3;};
console.log(str); // kiírja: 'strfunction() {return 3;}'
Miért látunk ilyen furcsa eredményt,
és nem a 3 számot? Mert a második tag
nem a függvény működésének eredménye, hanem annak forráskódja
(hiszen mi nem hívtuk meg a függvényt, csak
egyszerűen leírtuk).
Tehát a funkcionális kifejezés elnevezés azt jelenti, hogy egy ilyen függvény részt vesz valamilyen kifejezésben.
A változóhoz való hozzárendelés is kifejezés:
let func = function() {
console.log('!');
};
Lehetőség van például arra is, hogy egy függvényt
paraméterként adjunk át a console.log-nak, és az kiírja
annak forráskódját a konzolra - ez szintén
kifejezésnek számít:
console.log(function() {return 3;});
Miért fontos ez: mert a Function Declaration és a Function Expression közötti különbség egyáltalán nem az, hogy az első függvény névvel jön létre, míg a második eredetileg név nélküli. Ez nem így van.
Példa. Itt van egy függvényünk név nélkül, de közben nem vesz részt semmilyen kifejezésben (azaz nem hajtunk végre vele semmilyen műveletet, egyszerűen szólva):
/*
Ez a függvény Function Declaration lesz,
de szintaktikai hibával:
*/
function() {
console.log('!');
}
Egy ilyen kód egyáltalán hibát fog adni! Miért: mivel a függvény nem vesz részt semmilyen kifejezésben, a böngésző Function Declaration-nek tekinti, de nem találja a nevét, és hibát jelez.
Ahhoz, hogy a hiba eltűnjön, azt kell tennünk, hogy a függvényt
valamilyen kifejezés részévé tesszük. Például
írjunk elé egy + műveletet:
+function() { // egy ilyen kód helyes
console.log('!');
};
Hogyan működik ez: maga a + művelet
önmagában nem csinál semmit, ez olyan, mintha
a 3 szám helyett a +3 számot írnánk - megengedett,
de semmit sem változtat.
De függvény esetében - változtat. Most már a mi függvényünk nem csak le van írva, hanem részt vesz egy kifejezésben. Ezért most már nem lesz hiba. A függvény végrehajtásának eredménye sem lesz, hiszen csak leírtuk, de nem hívtuk meg.
A + helyett bármit írhatunk.
Például:
-function() { // egy ilyen kód helyes
console.log('!');
};
!function() { // egy ilyen kód helyes
console.log('!');
};
A függvényünket zárójelek közé is helyezhetjük, ebben az esetben az szintén funkcionális kifejezéssé válik:
(function() { // egy ilyen kód helyes
console.log('!');
});
Határozza meg, hogy az bemutatott függvény Function Declaration vagy Function Expression:
function func() {
console.log('!');
}
Határozza meg, hogy az bemutatott függvény Function Declaration vagy Function Expression:
let func = function() {
console.log('!');
}
Határozza meg, hogy az bemutatott függvény Function Declaration vagy Function Expression:
+function() {
console.log('!');
}
Határozza meg, hogy az bemutatott függvény Function Declaration vagy Function Expression:
!function func() {
console.log('!');
}
Határozza meg, hogy az bemutatott függvény Function Declaration vagy Function Expression:
-function func() {
console.log('!');
}
Határozza meg, hogy az bemutatott függvény Function Declaration vagy Function Expression:
1 + function func() {
console.log('!');
}
Határozza meg, hogy az bemutatott függvény Function Declaration vagy Function Expression:
(function func() {
console.log('!');
})
Határozza meg, hogy az bemutatott függvény Function Declaration vagy Function Expression:
console.log(
function() {
console.log('!');
}
);