Іменаваныя функцыянальныя выразы ў JavaScript
Хай у нас ёсць вось такое функцыянальнае выражэнне:
let test = function() {
console.log('!');
};
test(); // выведзе '!'
Давайце нашай функцыі дамо імя func:
let test = function func() {
console.log('!');
};
test();
Як вы ўжо ведаеце, па гэтым імені не звярнуцца да функцыі:
let test = function func() {
console.log('!');
};
test(); // выведзе '!'
func(); // выдасць памылку
Навошта ж даваць імя функцыі, калі яно не будзе даступна? Рэч у тым, што гэта імя будзе недаступна звонку функцыі, але даступна ўнутры гэтай функцыі.
Давайце праверым:
let test = function func() {
console.log(func); // функцыя выведзе свой жа зыходны код
};
test(); // выклікаем функцыю
Давайце выклічам нашу функцыю ўнутры яе самой:
let test = function func() {
console.log('!'); // выводзім '!'
func(); // выклікаем самі сябе
};
test();
Калі запусціць даны код, то ў кансоль будзе выводзіцца бясконцае колькасць вывадаў у кансоль.
На самай справе наша функцыя можа быць выклікана
ўнутры сябе не толькі як func, але
і як test:
let test = function func() {
console.log('!');
test(); // выклікаем самі сябе
};
test();
У чым жа розніца? Розніца ў тым, што імя
test - гэта проста пераменная. У працэсе
працы скрыпта наша функцыя можа запісацца
ў іншую пераменную ці перадацца параметрам
- у гэтым выпадку сувязь паміж пераменнай test
і функцыяй можа знікнуць.
Імя func ж жорстка прывязана да функцыі
спецыяльна для таго, каб можна было звярнуцца
да нашай функцыі ўнутры яе самой.
Такія Function Expression з імем функцыі называюцца іменаванымі функцыянальнымі выразамі.