Нюансы функцыянальных выразаў у 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('!');
}
);