Nazwane wyrażenia funkcyjne w JavaScript
Załóżmy, że mamy następujące wyrażenie funkcyjne:
let test = function() {
console.log('!');
};
test(); // wypisze '!'
Nadajmy naszej funkcji nazwę func:
let test = function func() {
console.log('!');
};
test();
Jak już wiesz, nie można odwołać się do funkcji po tej nazwie:
let test = function func() {
console.log('!');
};
test(); // wypisze '!'
func(); // zwróci błąd
Po co więc nadawać nazwę funkcji, jeśli nie będzie ona dostępna? Chodzi o to, że ta nazwa będzie niedostępna na zewnątrz funkcji, ale dostępna wewnątrz tej funkcji.
Sprawdźmy:
let test = function func() {
console.log(func); // funkcja wypisze swój własny kod źródłowy
};
test(); // wywołujemy funkcję
Wywołajmy naszą funkcję wewnątrz niej samej:
let test = function func() {
console.log('!'); // wypisujemy '!'
func(); // wywołujemy samych siebie
};
test();
Jeśli uruchomisz ten kod, to do konsoli zostanie wypisana nieskończona liczba wywołań.
W rzeczywistości nasza funkcja może zostać wywołana
wewnątrz siebie samej nie tylko jako func, ale
i jako test:
let test = function func() {
console.log('!');
test(); // wywołujemy samych siebie
};
test();
Jaka jest więc różnica? Różnica polega na tym, że nazwa
test to po prostu zmienna. W procesie
pracy skryptu nasza funkcja może zostać zapisana
w innej zmiennej lub przekazana jako parametr
- w tym przypadku związek między zmienną test
i funkcją może zniknąć.
Nazwa func jest natomiast sztywno przypisana do funkcji
specjalnie po to, aby można było odwołać się
do naszej funkcji wewnątrz niej samej.
Takie Function Expression z nazwą funkcji nazywane są nazwanymi wyrażeniami funkcyjnymi.