W przypadku anonimowego wyrażenia funkcyjnego funkcja jest anonimowa - dosłownie nie ma nazwy. Zmienna, do której jest przypisywana, ma nazwę, ale funkcja nie. (Aktualizacja: tak było w ES5. Od ES2015 [aka ES6] często funkcja utworzona za pomocą anonimowego wyrażenia otrzymuje prawdziwą nazwę [ale nie automatyczny identyfikator], czytaj dalej ...)
Nazwy są przydatne. Nazwy można zobaczyć w śladach stosu, stosach wywołań, listach punktów przerwania, itp. Nazwy są dobrą rzeczą ™.
(Kiedyś trzeba było uważać na nazwane wyrażenia funkcyjne w starszych wersjach IE [IE8 i poniżej], ponieważ omyłkowo utworzyły dwa całkowicie oddzielne obiekty funkcyjne w dwóch zupełnie różnych momentach [więcej w moim artykule na blogu Double take ]. Jeśli potrzebujesz obsługują IE8 [!!], prawdopodobnie najlepiej jest trzymać się anonimowych wyrażeń funkcji lub deklaracji funkcji , ale unikaj nazwanych wyrażeń funkcji.)
Jedną z kluczowych cech nazwanego wyrażenia funkcji jest to, że tworzy ono identyfikator w zakresie o tej nazwie dla funkcji w treści funkcji:
var x = function example() {
console.log(typeof example);
};
x();
console.log(typeof example);
Jednak od ES2015 wiele „anonimowych” wyrażeń funkcyjnych tworzy funkcje z nazwami, a było to poprzedzone przez różne nowoczesne silniki JavaScript, które dość sprytnie kojarzyły nazwy z kontekstem. W ES2015 anonimowe wyrażenie funkcji daje w wyniku funkcję o nazwie boo
. Jednak nawet z semantyką ES2015 +, automatyczny identyfikator nie jest tworzony:
var obj = {
x: function() {
console.log(typeof x);
console.log(obj.x.name);
},
y: function y() {
console.log(typeof y);
console.log(obj.y.name);
}
};
obj.x();
obj.y();
Przypisanie nazwy funkcji odbywa się za pomocą abstrakcyjnej operacji SetFunctionName używanej w różnych operacjach w specyfikacji.
Krótka wersja jest w zasadzie za każdym razem, gdy anonimowe wyrażenie funkcji pojawia się po prawej stronie czegoś takiego jak przypisanie lub inicjalizacja, na przykład:
var boo = function() { };
(lub może być, let
a const
raczej niż var
) , lub
var obj = {
boo: function() { }
};
lub
doSomething({
boo: function() { }
});
(te dwa ostatnie to tak naprawdę to samo) , wynikowa funkcja będzie miała nazwę ( boo
w przykładach).
Istnieje ważny i celowy wyjątek: przypisanie do właściwości istniejącego obiektu:
obj.boo = function() { };
Wynikało to z obaw związanych z wyciekiem informacji, które pojawiły się podczas dodawania nowej funkcji; szczegóły w mojej odpowiedzi na inne pytanie tutaj .