Używanie funkcji strzałkowych ES6 z this
powiązaniami leksykalnymi jest świetne.
Jednak przed chwilą napotkałem problem, używając go z typowym powiązaniem kliknięcia jQuery:
class Game {
foo() {
self = this;
this._pads.on('click', function() {
if (self.go) { $(this).addClass('active'); }
});
}
}
Zamiast tego użyj funkcji strzałki:
class Game {
foo() {
this._pads.on('click', () => {
if (this.go) { $(this).addClass('active'); }
});
}
}
A następnie $(this)
jest konwertowany na zamknięcie typu ES5 (self = this).
Czy jest sposób, aby Traceur ignorował "$ (this)" dla leksykalnego wiązania?
.on()
rzeczywiście ma onathis
przydatną wartość. Dla mnie jest to o wiele jaśniejsze wthis
odniesieniu do celu zdarzenia niż konieczność przechodzenia go i znajdowania celu ręcznie. Nie bawiłem się zbytnio funkcjami strzałkowymi, ale wydaje się, że poruszanie się w tę iz powrotem z funkcjami anonimowymi byłoby mylące.Odpowiedzi:
To nie ma nic wspólnego z Traceur i wyłączaniem czegoś, tak po prostu działa ES6. Jest to konkretna funkcja, o którą prosisz,
=>
zamiastfunction () { }
.Jeśli chcesz napisać ES6, musisz pisać ES6 cały czas, nie możesz włączać i wyłączać tego w pewnych wierszach kodu, a na pewno nie możesz tłumić ani zmieniać sposobu
=>
działania. Nawet gdybyś mógł, skończyłbyś z jakąś dziwaczną wersją JavaScript, którą tylko Ty rozumiesz i która nigdy nie działałaby poprawnie poza Twoim dostosowanym Traceur, co zdecydowanie nie jest celem Traceur.Aby rozwiązać ten konkretny problem, nie należy używać
this
do uzyskania dostępu do klikniętego elementu, ale zamiast tego użyćevent.currentTarget
:jQuery zapewnia
event.currentTarget
szczególnie, ponieważ nawet przed ES6 nie zawsze jest możliwe, aby jQuery narzucił funkcjęthis
wywołania zwrotnego (tj. jeśli została powiązana z innym kontekstem za pośrednictwembind
.źródło
.on
połączeń delegowanych , wthis
rzeczywistości jestevent.currentTarget
.this
==event.currentTarget
. Nie?this
ievent.currentTarget
są takie same, chyba żethis
są związane z zakresem obejmującym, jak w przypadku funkcji strzałkowej ES6.Wiązanie wydarzenia
Pętla
źródło
$jQueryElements.each()
? jQuery w rzeczywistości wysyła pewne argumenty do każdego obiektu, więc w ogóle tego nie potrzebujesz => To$(...).each((index, el) => console.log(el))
Inna sprawa
Najlepsza odpowiedź jest poprawna i zagłosowałem za nią.
Jest jednak inny przypadek:
Można to naprawić jako:
Jest to historyczny błąd w jQuery, który umieszcza indeks zamiast elementu jako pierwszy argument:
Zobacz: https://api.jquery.com/each/#each-function
źródło
$('jquery-selector').map
(To jest odpowiedź, którą napisałem na inną wersję tego pytania, zanim dowiedziałem się, że była to duplikat tego pytania. Myślę, że odpowiedź zbiera informacje dość wyraźnie, więc zdecydowałem się dodać ją jako wiki społeczności, chociaż jest ona w dużej mierze po prostu inna sformułowanie innych odpowiedzi.)
Nie możesz. To połowa punktu funkcji strzałkowych, zamykają się
this
zamiast mieć własne, które są ustawione przez ich wywołanie. W przypadku użycia w pytaniu, jeśli chceszthis
ustawić przez jQuery podczas wywoływania procedury obsługi, procedura obsługi musiałaby byćfunction
funkcją.Ale jeśli masz powód do używania strzałki (być może chcesz użyć
this
do tego, co to oznacza poza strzałką), możesz użyće.currentTarget
zamiast,this
jeśli chcesz:Obiekt
currentTarget
zdarzenia jest taki sam, jak ustawia jQuerythis
podczas wywoływania programu obsługi.źródło
Jak powiedział Meager w swojej odpowiedzi na to samo pytanie, jeśli chcesz pisać ES6, musisz cały czas pisać ES6 ,
więc jeśli używasz funkcji strzałkowej ES6:,
(event)=>{}
musisz użyć$(event.currentTarget)
zamiast$(this)
.możesz też użyć ładniejszego i czystszego sposobu korzystania z currentTarget jako
({currentTarget})=>{}
,pierwotnie pomysł ten został skomentowany przez rizzi Frank w odpowiedzi @ Meager i uznałem , że jest przydatny i myślę, że nie wszyscy ludzie przeczytają ten komentarz, więc napisałem go jako kolejną odpowiedź.
źródło