Именовани функционални изрази в 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 с име на функция се наричат именовани функционални изрази.