Niuanse wyrażeń funkcyjnych w JavaScript
Nazwa Function Expression nie jest nadana bez powodu. Naprawdę oznacza to - że takie funkcje są częścią jakiegoś wyrażenia.
Na przykład, możemy dodać jakiś ciąg znaków i funkcję bez nazwy:
let str = 'str' + function() {return 3;};
console.log(str); // wyświetli 'strfunction() {return 3;}'
Dlaczego widzimy taki dziwny wynik,
a nie liczbę 3? Ponieważ drugi składnik
- to nie wynik działania funkcji, a jej źródłowy
kod (przecież tej funkcji nie wywołaliśmy, a po prostu
napisaliśmy).
Czyli nazwa wyrażenie funkcyjne oznacza, że taka funkcja bierze udział w jakimś wyrażeniu.
Przypisanie do zmiennej też jest wyrażeniem:
let func = function() {
console.log('!');
};
Można również, na przykład, przekazać funkcję
jako parametr do console.log i on wyświetli
jej źródłowy kod w konsoli - to też będzie
uważane za wyrażenie:
console.log(function() {return 3;});
Dlaczego to jest ważne: ponieważ różnica między Function Declaration a Function Expression wcale nie polega na tym, że pierwsza funkcja jest tworzona z nazwą, a druga początkowo nie ma imienia. Tak nie jest.
Przykład. Oto mamy funkcję bez nazwy, ale przy tym nie bierze udziału w żadnym wyrażeniu (to znaczy nie jest z nią wykonywana żadna akcja, mówiąc prosto):
/*
Ta funkcja będzie Function Declaration,
ale z błędem składniowym:
*/
function() {
console.log('!');
}
Tak kod w ogóle zwróci błąd! Dlaczego: tak jak funkcja nie bierze udziału w żadnym wyrażeniu, to przeglądarka uważa ją za Function Declaration, ale nie znajduje jej nazwy i zwraca błąd.
Aby błąd zniknął, trzeba sprawić, żeby funkcja
stała się częścią jakiegoś wyrażenia. Na przykład,
napiszmy przed nią operację +:
+function() { // taki kod jest poprawny
console.log('!');
};
Jak to działa: sama operacja +
nic nie robi, to tak jak napisać
zamiast liczby 3 liczbę +3 - dopuszczalne,
ale nic nie zmienia.
Ale w przypadku funkcji - zmienia. Teraz nasza funkcja już nie jest po prostu napisana, a bierze udział w wyrażeniu. Dlatego błędu już nie będzie. Wyniku wykonania funkcji też nie będzie, przecież ją po prostu napisaliśmy, ale nie wywołaliśmy.
Zamiast + można napisać cokolwiek.
Na przykład:
-function() { // taki kod jest poprawny
console.log('!');
};
!function() { // taki kod jest poprawny
console.log('!');
};
Można również wziąć naszą funkcję w okrągłe nawiasy, w tym przypadku również stanie się wyrażeniem funkcyjnym:
(function() { // taki kod jest poprawny
console.log('!');
});
Określ, czy przedstawiona funkcja jest Function Declaration czy Function Expression:
function func() {
console.log('!');
}
Określ, czy przedstawiona funkcja jest Function Declaration czy Function Expression:
let func = function() {
console.log('!');
}
Określ, czy przedstawiona funkcja jest Function Declaration czy Function Expression:
+function() {
console.log('!');
}
Określ, czy przedstawiona funkcja jest Function Declaration czy Function Expression:
!function func() {
console.log('!');
}
Określ, czy przedstawiona funkcja jest Function Declaration czy Function Expression:
-function func() {
console.log('!');
}
Określ, czy przedstawiona funkcja jest Function Declaration czy Function Expression:
1 + function func() {
console.log('!');
}
Określ, czy przedstawiona funkcja jest Function Declaration czy Function Expression:
(function func() {
console.log('!');
})
Określ, czy przedstawiona funkcja jest Function Declaration czy Function Expression:
console.log(
function() {
console.log('!');
}
);