Funkcje strzałkowe nie są przeznaczone do użytku w każdej sytuacji, a jedynie jako krótsza wersja staromodnych funkcji. Nie mają na celu zastąpienia składni funkcji za pomocą function
słowa kluczowego. Najczęstszym przypadkiem użycia funkcji strzałkowych są krótkie „lambdy”, które nie zmieniają definicji this
, często używane podczas przekazywania funkcji jako wywołania zwrotnego do jakiejś funkcji.
Funkcji strzałkowych nie można używać do pisania metod obiektowych, ponieważ, jak już zauważyłeś, ponieważ funkcje strzałkowe zamykają się nad this
kontekstem obejmującym leksykalnie, this
wewnątrz strzałki jest to, które było aktualne w miejscu zdefiniowania obiektu. To znaczy:
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner;
}
};
W twoim przypadku chcąc napisać metodę na obiekcie, powinieneś po prostu użyć tradycyjnej function
składni lub składni metody wprowadzonej w ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Są między nimi niewielkie różnice, ale są one ważne tylko wtedy, gdy używasz programu super
w programie getOwner
, którego nie jesteś, lub kopiujesz getOwner
do innego obiektu).
Na liście mailingowej es6 odbyła się debata na temat zmiany w funkcjach strzałek, które mają podobną składnię, ale mają własną this
. Jednak ta propozycja została źle przyjęta, ponieważ jest to zwykły cukier składniowy, pozwalający ludziom zaoszczędzić na wpisywaniu kilku znaków i nie zapewnia nowej funkcjonalności w stosunku do istniejącej składni funkcji. Zobacz temat niezwiązane funkcje strzałek .
this
inaczej. Jest definiowana przez środowisko leksykalne, w którym została utworzona funkcja, co oznacza, żethis
wartość, w której utworzyszchopper
zmienną, będziethis
wartością funkcji. Innymi słowy, nie będzie odnosić się dochopper
obiektu.