Нюанси на функционалните изрази в JavaScript
Името Function Expression не е дадено просто така. То наистина означава това - че такива функции са част от някакъв израз.
Например, можем да съберем някакъв низ и анонимна функция:
let str = 'str' + function() {return 3;};
console.log(str); // ще изведе 'strfunction() {return 3;}'
Защо виждаме такъв странен резултат,
а не числото 3? Защото второто събираемо
- това не е резултатът от работата на функцията, а нейният изходен
код (все пак ние не извикахме тази функция, а просто
я написахме).
Тоест името функционален израз означава, че такава функция взема участие в някакъв израз.
Присвояването към променлива също е израз:
let func = function() {
console.log('!');
};
Може също, например, да се подаде функция
като параметър на console.log и той ще изведе
нейния изходен код в конзолата - това също ще се
счита за израз:
console.log(function() {return 3;});
Защо това е важно: защото разликата между Function Declaration и Function Expression изобщо не е в това, че първата функция се създава с име, а втората първоначално няма име. Това не е така.
Пример. Ето ни е функция без име, но при това не участва в нито един израз (то ест с нея не се извършват никакви действия, казано по-просто):
/*
Тази функция ще бъде Function Declaration,
но със синтактична грешка:
*/
function() {
console.log('!');
}
Такъв код изобщо ще даде грешка! Защо: тъй като функцията не участва в нито един израз, браузърът я счита за Function Declaration, но не намира нейното име и дава грешка.
За да изчезне грешката, трябва да накараме функцията
да стане част от някакъв израз. Например,
да напишем пред нея операция +:
+function() { // такъв код е коректен
console.log('!');
};
Как работи това: самата операция +
нищо не прави, това е все едно да напишем
вместо числото 3 числото +3 - допустимо,
но нищо не променя.
Но в случая с функцията - променя. Сега нашата функция вече не е просто написана, а участва в израз. Затова грешка вече няма да има. Резултат от изпълнение на функцията също няма да има, тъй като ние просто я написахме, но не я извикахме.
Вместо + може да се напише всичко възможно.
Например:
-function() { // такъв код е коректен
console.log('!');
};
!function() { // такъв код е коректен
console.log('!');
};
Може също така да се сложи нашата функция в кръгли скоби, в този случай тя също ще стане функционален израз:
(function() { // такъв код е коректен
console.log('!');
});
Определете дали представената функция е Function Declaration или Function Expression:
function func() {
console.log('!');
}
Определете дали представената функция е Function Declaration или Function Expression:
let func = function() {
console.log('!');
}
Определете дали представената функция е Function Declaration или Function Expression:
+function() {
console.log('!');
}
Определете дали представената функция е Function Declaration или Function Expression:
!function func() {
console.log('!');
}
Определете дали представената функция е Function Declaration или Function Expression:
-function func() {
console.log('!');
}
Определете дали представената функция е Function Declaration или Function Expression:
1 + function func() {
console.log('!');
}
Определете дали представената функция е Function Declaration или Function Expression:
(function func() {
console.log('!');
})
Определете дали представената функция е Function Declaration или Function Expression:
console.log(
function() {
console.log('!');
}
);