Funkcje strzałkowe
Funkcja strzałkowa - strzałka - jest nowym sposobem na definiowanie wyrażeń funkcyjnych.
Przykład 4.1
function square (a) {
return a * a;
}
let square2 = a => a * a;
Nowa notacja pozwala na pominięcie słów kluczowych function
i return
oraz klamry. Strzałki domyślnie zwracają to co znajduje się za =>
.
Parametry
Jeżeli chcemy aby nasza strzałka nie miała parametrów lub miała ich więcej niż jeden musimy użyć nawiasów.
Przykład 4.2
() => 10
(a, b) => a * b
W przypadku funkcji strzałkowych nie możemy skorzystać z arguments
ale w ES6 możemy skorzystać z parametrów resztowych.
Ciało funkcji
Jednak nie zawsze chcemy lub możemy wykonać wszystko w jednym wyrażeniu. Aby zdefiniować ciało strzałki używamy nawiasy klamrowe.
Przykład 4.3
(a) => {
return a * a;
}
Jeśli zdefiniujemy ciało strzałki nie zwraca już ona domyślnie swojej wartości - musimy użyć jawnie słowa kluczowego return
.
Jak zatem zwrócić obiekt a nie definiować ciało funkcji? Same klamry obiektu zostaną zinterpretowane jako ciało funkcji. Jednak jeśli otoczymy je nawiasami ()
to będziemy mogli zwrócić obiekt.
Przykład 4.4
(a) => ({
value: a
})
this
Subtelną ale bardzo ważną rożnicą pomiędzy zwykłą funkcją a strzałką jest wiązanie wartości this
.
Przykład 4.5
class Foo {
constructor (data) {
this.data = data;
}
update (data) {
let self = this;
setTimeout(function () { self.data = data; }, 50);
}
}
W powyższym przykładzie wewnątrz function
wartość this
będzie równa undefined
lub window
przez co musieliśmy zasotoswać self pattern
aby móc uzyskać dostęp do własciwego this
- instancji klasy Foo
.
Rozwiązaniem jest zasotoswanie funkcji strzałkowej.
Przykład 4.6
class Foo {
constructor (data) {
this.data = data;
}
update (data) {
setTimeout(() => { this.data = data; }, 50);
}
}
Funkcja strzałkowa dziedziczy this
z zewnętrzego zakresu dzięki czemu mogliśmy bezpośrednio odwołać się do instancji klasy Foo
przez this
.
TIP:
- Z funkcji niestrzałkowych należy korzystać w przypadku metod wywoływanych poprzez składnię
obiekt.metoda()
. Funkcje te otrzymają sensowną wartośćthis
od wywołującego je obiektu.- Funkcji strzałkowych należy używać w pozostałych przypadkach.
Ćwiczenie
(4.1) Uzupełnij implementację metody even()
, tak aby zwracała ona tylko parzyste liczby z przekazanej tablicy liczb.
class ArrayUtils {
static even (numbers) {
// return ...
}
}