Nuansy funkčných výrazov v JavaScripte

Názov Function Expression nie je daný len tak. Skutočne znamená to, že takéto funkcie sú súčasťou nejakého výrazu.

Napríklad, môžeme spojiť nejaký reťazec a funkciu bez mena:

javascriptlet str = 'str' + function() {return 3;};
console.log(str); // vypíše 'strfunction() {return 3;}'

Prečo vidíme taký zvlášny výsledok, a nie číslo 3? Pretože druhý sčítanec - to nie je výsledok práce funkcie, ale jej zdrojový kód (veď sme tú funkciu nezavolali, ale jednoducho napísali).

To znamená, že názov funkčný výraz označuje to, že takáto funkcia sa zúčastňuje nejakého výrazu.

Priradenie k premennej je tiež výraz:

javascriptlet func = function() {
  console.log('!');
};

Môžeme tiež, napríklad, odovzdať funkciu ako parameter do console.log a ten vypíše jej zdrojový kód do konzoly - to sa tiež bude považovať za výraz:

javascriptconsole.log(function() {return 3;});

Prečo je to dôležité: pretože rozdiel medzi Function Declaration a Function Expression vôbec nie je v tom, že prvá funkcia je vytvorená s menom, a druhá pôvodne meno nemá. Tak to nie je.

Príklad. Tu máme funkciu bez mena, ale pri tom nie je súčasťou žiadneho výrazu (to znamená, že s ňou nevykonávame žiadne akcie, povedané jednoducho):

javascript/*
  Táto funkcia bude Function Declaration,
  ale so syntaktickou chybou:
*/
function() {
  console.log('!');
}

Takýto kód vo všeobecnosti vyvolá chybu! Prečo: tak ako funkcia nie je súčasťou žiadneho výrazu, prehliadač ju považuje za Function Declaration, ale nenachádza jej meno a vyvoláva chybu.

Aby chyba zmizla, je potrebné prinútiť funkciu stať sa súčasťou nejakého výrazu. Napríklad, napíšeme pred ňou operáciu +:

javascript+function() { // takýto kód je korektný
  console.log('!');
};

Ako to funguje: samotná operácia + nič nerobí, je to rovnako ako napísať namiesto čísla 3 číslo +3 - prípustné, ale nič nemení.

Ale v prípade funkcie - mení. Teraz naša funkcia už nie je jednoducho napísaná, ale zúčastňuje sa výrazu. Preto chyba teraz nebude. Výsledku vykonania funkcie tiež nebude, veď sme ju jednoducho napísali, ale nezavolali.

Namiesto + je možné napísať čokoľvek. Napríklad:

javascript-function() { // takýto kód je korektný
  console.log('!');
};

!function() { // takýto kód je korektný
  console.log('!');
};

Môžeme tiež vziať našu funkciu do okrúhlych zátvoriek, v tomto prípade sa tiež stane funkčným výrazom:

javascript(function() { // takýto kód je korektný
  console.log('!');
});
Задание 1

Určite, či je predstavená funkcia Function Declaration alebo Function Expression:

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

Určite, či je predstavená funkcia Function Declaration alebo Function Expression:

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

Určite, či je predstavená funkcia Function Declaration alebo Function Expression:

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

Určite, či je predstavená funkcia Function Declaration alebo Function Expression:

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

Určite, či je predstavená funkcia Function Declaration alebo Function Expression:

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

Určite, či je predstavená funkcia Function Declaration alebo Function Expression:

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

Určite, či je predstavená funkcia Function Declaration alebo Function Expression:

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

Určite, či je predstavená funkcia Function Declaration alebo Function Expression:

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