JavaScript/Funkcje anonimowe
Poprzedni: Funkcje | Indeks | Następny: Programowanie obiektowe |
Funkcja anonimowa to funkcja, która została zadeklarowana bez żadnego nazwanego identyfikatora, który mógłby się do niej odwoływać. Jako taka, funkcja anonimowa zwykle nie jest dostępna po jej początkowym utworzeniu.
Normalna definicja funkcji:
function hello() { alert('Hello world');}hello();
Definicja funkcji anonimowej:
var anon = function() { alert('I am anonymous');}anon();
Jednym z powszechnych zastosowań funkcji anonimowych jest używanie ich jako argumentów innych funkcji. Innym częstym zastosowaniem jest zamknięcie, o którym również w rozdziale Zamknięcia.
Użycie jako argumentu do innych funkcji:
setTimeout(function() { alert('hello');}, 1000);
Powyżej funkcja anonimowa jest przekazywana do setTimeout, który wykona funkcję za 1000 milisekund.
Użycie jako zamknięcia:
(function() { alert('foo');}());
Rozkład powyższych anonimowych stwierdzeń:
- Nawiasy otaczające są opakowaniem dla anonimowej funkcji
- Wleczone nawiasy inicjują wywołanie funkcji i mogą zawierać argumenty
Inny sposób napisania poprzedniego przykładu i uzyskania tego samego wyniku:
(function(message) { alert(message);}('foo'));
Alternatywna reprezentacja powyższego umieszcza inicjujące nawiasy klamrowe do otaczających nawiasów klamrowych, a nie do samej funkcji, co powoduje zamieszanie co do tego, dlaczego otaczające nawiasy klamrowe są potrzebne w pierwszej kolejności.
(function() { // …})();
Niektórzy nawet uciekli się do nadania technice nawiasów klamrowych uwłaczających nazw, w celu zachęcenia ludzi do przeniesienia ich z powrotem do środka otaczających nawiasów klamrowych, gdzie inicjują funkcję, zamiast do otaczających nawiasów klamrowych.
Anonimowa funkcja może odwoływać się do siebie poprzez zmienną lokalną arguments.callee, przydatną dla rekurencyjnych anonimowych funkcji:
// returns the factorial of 10.alert((function(n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n;})(10));
Jednakże, arguments.callee jest zdeprecjonowane w ECMAScript 5 Strict. Problemy z arguments.callee są takie, że uniemożliwia to osiągnięcie rekursji ogonowej (przyszły plan dla JavaScript), i skutkuje inną wartością this. Zamiast używać arguments.callee, możesz użyć nazwanego wyrażenia funkcji:
// returns the factorial of 10.alert( (function factorial(n) { return (n <= 1) ? 1 : factorial(n - 1) * n;})(10) );
Wyrażenie funkcji strzałki jest podobne do tego, co w innych językach programowania jest znane jako lambda, wprowadzone w ECMAScript 6 w 2015 roku. Zapewnia ono skrót do tworzenia anonimowych funkcji.
Przykłady:
- x => x + 1
- Anonimowa funkcja z jednym argumentem x, która zwraca x + 1.
- x => {return x + 1}
- Jak wyżej, ale z ciałem funkcji.
- (x, y) => x + y
- Dwuargowa funkcja strzałkowa.
- (x, y) => {return x + y}
Linki:
- Funkcje # The_arrow function expression, developer.mozilla.org
- Functions/Arrow functions, developer.mozilla.org
.