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 ... 
  }
}

Źródła

results matching ""

    No results matching ""