Funkcinių išraiškų niuansai JavaScript
Pavadinimas Function Expression duotas ne be reikalo. Jis tikrai reiškia tai - kad tokios funkcijos yra kokios nors išraiškos dalis.
Pavyzdžiui, mes galime sudėti kokią nors eilutę ir funkciją be pavadinimo:
let str = 'str' + function() {return 3;};
console.log(str); // išvests 'strfunction() {return 3;}'
Kodėl mes matome tokį keistą rezultatą,
o ne skaičių 3? Todėl, kad antrasis dėmuo
- tai ne funkcijos vykdymo rezultatas, o jos pirminis
kodas (juk mes tą funkciją ne iškvietėme, o tiesiog
parašėme).
Tai yra, pavadinimas funkcinė išraiška reiškia tai, kad tokia funkcija dalyvauja kokioje nors išraiškoje.
Priskyrimas kintamajam taip pat yra išraiška:
let func = function() {
console.log('!');
};
Taip pat galima, pavyzdžiui, perduoti funkciją
kaip parametrą į console.log ir jis išves
jos pirminį kodą į konsolę - tai taip pat bus
laikoma išraiška:
console.log(function() {return 3;});
Kodėl tai svarbu: todėl, kad skirtumas tarp Function Declaration ir Function Expression visai ne tas, kad pirmoji funkcija sukuriama su pavadinimu, o antroji iš pradžių pavadinimo neturi. Tai netiesa.
Pavyzdys. Štai mes turime funkciją be pavadinimo, bet tuo pačiu nedalyvaujančią jokioje išraiškoje (tai yra su ja neatliekami jokie veiksmai, kalbant paprastai):
/*
Ši funkcija bus Function Declaration,
bet su sintakse klaida:
*/
function() {
console.log('!');
}
Toks kodas apskritai duos klaidą! Kodėl: taip kaip funkcija nedalyvauja jokioje išraiškoje, naršyklė laiko ją Function Declaration, bet neranda jos pavadinimo ir pateikia klaidą.
Kad klaida išnyktų, reikia priverti funkciją
tapti kokios nors išraiškos dalimi. Pavyzdžiui,
parašykime prieš ją operaciją +:
+function() { // toks kodas korektiškas
console.log('!');
};
Kaip tai veikia: pati operacija +
nieko nekeičia, tai vis tiek kaip parašyti
vietoj skaičiaus 3 skaičių +3 - leistina,
bet nieko nekeičia.
Bet funkcijos atveju - keičia. Dabar mūsų funkcija jau ne tik parašyta, bet dalyvauja išraiškoje. Todėl klaidos dabar nebus. Funkcijos vykdymo rezultato taip pat nebus, nes mes ją tiesiog parašėme, bet neiškvietėme.
Vietoj + galima parašyti bet ką.
Pavyzdžiui:
-function() { // toks kodas korektiškas
console.log('!');
};
!function() { // toks kodas korektiškas
console.log('!');
};
Taip pat galima paimti mūsų funkciją į round skliaustus, šiuo atveju ji taip pat taps funkcine išraiška:
(function() { // toks kodas korektiškas
console.log('!');
});
Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:
function func() {
console.log('!');
}
Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:
let func = function() {
console.log('!');
}
Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:
+function() {
console.log('!');
}
Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:
!function func() {
console.log('!');
}
Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:
-function func() {
console.log('!');
}
Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:
1 + function func() {
console.log('!');
}
Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:
(function func() {
console.log('!');
})
Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:
console.log(
function() {
console.log('!');
}
);