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:

javascriptlet 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:

javascriptlet 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:

javascriptconsole.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):

javascript/*
  Š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ą +:

javascript+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:

javascript-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:

javascript(function() { // toks kodas korektiškas
  console.log('!');
});
Задание 1

Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:

javascriptfunction func() {
  console.log('!');
}
Задание 2

Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:

javascriptlet func = function() {
  console.log('!');
}
Задание 3

Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:

javascript+function() {
  console.log('!');
}
Задание 4

Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:

javascript!function func() {
  console.log('!');
}
Задание 5

Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:

javascript-function func() {
  console.log('!');
}
Задание 6

Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:

javascript1 + function func() {
  console.log('!');
}
Задание 7

Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:

javascript(function func() {
  console.log('!');
})
Задание 8

Nustatykite, ar pateikta funkcija yra Function Declaration ar Function Expression:

javascriptconsole.log(
  function() {
    console.log('!');
  }
);