Nijanse funkcionalnih izraza u JavaScript
Ime Function Expression nije dato bez razloga. Ono zaista znači to - da su takve funkcije deo nekog izraza.
Na primer, možemo sabrati neki string i anonimnu funkciju:
let str = 'str' + function() {return 3;};
console.log(str); // ispisaće 'strfunction() {return 3;}'
Zašto vidimo tako čudan rezultat,
a ne broj 3? Zato što drugi sabirak
nije rezultat rada funkcije, već njen izvorni
kod (jer mi tu funkciju nismo pozvali, već smo je samo
napisali).
To jest, ime funkcionalni izraz označava da takva funkcija učestvuje u nekom izrazu.
Dodeljivanje promenljivoj je takođe izraz:
let func = function() {
console.log('!');
};
Takođe možemo, na primer, proslediti funkciju
kao parametar u console.log i ona će ispisati
njen izvorni kod u konzolu - to će se takođe
smatrati izrazom:
console.log(function() {return 3;});
Zašto je ovo važno: zato što razlika između Function Declaration i Function Expression uopšte nije u tome što se prva funkcija kreira sa imenom, a druga u početku nema ime. To nije tačno.
Primer. Evo funkcija bez imena, ali istovremeno ne učestvuje ni u kakvom izrazu (tj. s njom se ne vrši nikakva radnja, rečima prostim):
/*
Ova funkcija će biti Function Declaration,
ali sa sintaksnom greškom:
*/
function() {
console.log('!');
}
Ovakav kod će uopšte dati grešku! Zašto: pošto funkcija ne učestvuje ni u kakvom izrazu, brauzer je smatra Function Declaration-om, ali ne pronalazi njeno ime i izbacuje grešku.
Da bi greška nestala, potrebno je da funkcija postane
deo nekog izraza. Na primer,
napišimo ispred nje operaciju +:
+function() { // ovakav kod je korektan
console.log('!');
};
Kako ovo radi: sama operacija +
ništa ne radi, to je isto kao da napišemo
umesto broja 3 broj +3 - dopušteno je,
ali ništa ne menja.
Ali u slučaju sa funkcijom - menja. Sada naša funkcija više nije samo napisana, već učestvuje u izrazu. Zbog toga greške sada neće biti. Rezultata izvršavanja funkcije takođe neće biti, pošto smo je samo napisali, ali nismo pozvali.
Umesto + možemo napisati bilo šta.
Na primer:
-function() { // ovakav kod je korektan
console.log('!');
};
!function() { // ovakav kod je korektan
console.log('!');
};
Takođe možemo staviti našu funkciju u obične zagrade, u tom slučaju ona takođe postaje funkcionalni izraz:
(function() { // ovakav kod je korektan
console.log('!');
});
Odredite da li je predstavljena funkcija Function Declaration ili Function Expression:
function func() {
console.log('!');
}
Odredite da li je predstavljena funkcija Function Declaration ili Function Expression:
let func = function() {
console.log('!');
}
Odredite da li je predstavljena funkcija Function Declaration ili Function Expression:
+function() {
console.log('!');
}
Odredite da li je predstavljena funkcija Function Declaration ili Function Expression:
!function func() {
console.log('!');
}
Odredite da li je predstavljena funkcija Function Declaration ili Function Expression:
-function func() {
console.log('!');
}
Odredite da li je predstavljena funkcija Function Declaration ili Function Expression:
1 + function func() {
console.log('!');
}
Odredite da li je predstavljena funkcija Function Declaration ili Function Expression:
(function func() {
console.log('!');
})
Odredite da li je predstavljena funkcija Function Declaration ili Function Expression:
console.log(
function() {
console.log('!');
}
);