Нюанси на функционалните изрази в JavaScript

Името Function Expression не е дадено просто така. То наистина означава това - че такива функции са част от някакъв израз.

Например, можем да съберем някакъв низ и анонимна функция:

javascriptlet str = 'str' + function() {return 3;};
console.log(str); // ще изведе 'strfunction() {return 3;}'

Защо виждаме такъв странен резултат, а не числото 3? Защото второто събираемо - това не е резултатът от работата на функцията, а нейният изходен код (все пак ние не извикахме тази функция, а просто я написахме).

Тоест името функционален израз означава, че такава функция взема участие в някакъв израз.

Присвояването към променлива също е израз:

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

Може също, например, да се подаде функция като параметър на console.log и той ще изведе нейния изходен код в конзолата - това също ще се счита за израз:

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

Защо това е важно: защото разликата между Function Declaration и Function Expression изобщо не е в това, че първата функция се създава с име, а втората първоначално няма име. Това не е така.

Пример. Ето ни е функция без име, но при това не участва в нито един израз (то ест с нея не се извършват никакви действия, казано по-просто):

javascript/*
  Тази функция ще бъде Function Declaration,
  но със синтактична грешка:
*/
function() {
  console.log('!');
}

Такъв код изобщо ще даде грешка! Защо: тъй като функцията не участва в нито един израз, браузърът я счита за Function Declaration, но не намира нейното име и дава грешка.

За да изчезне грешката, трябва да накараме функцията да стане част от някакъв израз. Например, да напишем пред нея операция +:

javascript+function() { // такъв код е коректен
  console.log('!');
};

Как работи това: самата операция + нищо не прави, това е все едно да напишем вместо числото 3 числото +3 - допустимо, но нищо не променя.

Но в случая с функцията - променя. Сега нашата функция вече не е просто написана, а участва в израз. Затова грешка вече няма да има. Резултат от изпълнение на функцията също няма да има, тъй като ние просто я написахме, но не я извикахме.

Вместо + може да се напише всичко възможно. Например:

javascript-function() { // такъв код е коректен
  console.log('!');
};

!function() { // такъв код е коректен
  console.log('!');
};

Може също така да се сложи нашата функция в кръгли скоби, в този случай тя също ще стане функционален израз:

javascript(function() { // такъв код е коректен
  console.log('!');
});
Задание 1

Определете дали представената функция е Function Declaration или Function Expression:

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

Определете дали представената функция е Function Declaration или Function Expression:

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

Определете дали представената функция е Function Declaration или Function Expression:

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

Определете дали представената функция е Function Declaration или Function Expression:

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

Определете дали представената функция е Function Declaration или Function Expression:

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

Определете дали представената функция е Function Declaration или Function Expression:

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

Определете дали представената функция е Function Declaration или Function Expression:

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

Определете дали представената функция е Function Declaration или Function Expression:

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