Die Verwendung von ES6-Pfeilfunktionen mit lexikalischer this
Bindung ist großartig.
Vor kurzem bin ich jedoch auf ein Problem gestoßen, das ich mit einer typischen jQuery-Klickbindung verwendet habe:
class Game {
foo() {
self = this;
this._pads.on('click', function() {
if (self.go) { $(this).addClass('active'); }
});
}
}
Verwenden Sie stattdessen eine Pfeilfunktion:
class Game {
foo() {
this._pads.on('click', () => {
if (this.go) { $(this).addClass('active'); }
});
}
}
Und wird dann $(this)
in einen ES5-Verschluss (self = this) konvertiert.
Kann Traceur "$ (this)" für die lexikalische Bindung ignorieren?
.on()
dies tatsächlich einenthis
für Sie nützlichen Wert hat. Für mich ist es viel klarer,this
sich auf das Ereignisziel zu beziehen, als das Ereignis zu bestehen und das Ziel manuell zu finden. Ich habe nicht viel mit Pfeilfunktionen gespielt, aber es scheint verwirrend, mit anonymen Funktionen hin und her zu gehen.Antworten:
Das hat nichts mit Traceur zu tun und etwas auszuschalten. So funktioniert ES6 einfach. Es ist die spezifische Funktionalität, nach der Sie fragen, indem Sie
=>
statt verwendenfunction () { }
.Wenn Sie ES6 schreiben möchten, müssen Sie ständig ES6 schreiben, Sie können in bestimmten Codezeilen nicht ein- und ausschalten und Sie können die Funktionsweise definitiv nicht unterdrücken oder ändern
=>
. Selbst wenn Sie könnten, würden Sie nur mit einer bizarren Version von JavaScript enden, die nur Sie verstehen und die außerhalb Ihres angepassten Traceur niemals richtig funktionieren würde, was definitiv nicht der Sinn von Traceur ist.Die Lösung dieses speziellen Problems besteht nicht darin
this
, Zugriff auf das angeklickte Element zu erhalten, sondernevent.currentTarget
:jQuery bietet
event.currentTarget
speziell, weil es jQuery noch vor ES6 nicht immer möglich ist,this
der Rückruffunktion ein a aufzuerlegen (dh, wenn es über an einen anderen Kontext gebunden warbind
.quelle
.on
Anrufe abweicht ,this
ist es tatsächlichevent.currentTarget
.this
==event.currentTarget
. Nein?this
Undevent.currentTarget
sind dieselben, sofernthis
sie nicht an den umschließenden Bereich gebunden sind, wie bei einer ES6-Pfeilfunktion.Ereignisbindung
Schleife
quelle
$jQueryElements.each()
? jQuery sendet tatsächlich einige Argumente an jedes Objekt, sodass Sie diese überhaupt nicht benötigen => It's$(...).each((index, el) => console.log(el))
Ein anderer Fall
Die Top-Antwort ist richtig und ich habe sie hochgestimmt.
Es gibt jedoch einen anderen Fall:
Könnte behoben werden als:
Dies ist ein historischer Fehler in jQuery, bei dem der Index anstelle des Elements als erstes Argument verwendet wird:
Siehe: https://api.jquery.com/each/#each-function
quelle
$('jquery-selector').map
(Dies ist eine Antwort, die ich für eine andere Version dieser Frage geschrieben habe, bevor ich erfuhr, dass es sich um ein Duplikat dieser Frage handelt. Ich denke, die Antwort fasst die Informationen ziemlich klar zusammen, daher habe ich beschlossen, sie als Community-Wiki hinzuzufügen, obwohl sie größtenteils nur anders ist Formulierung der anderen Antworten.)
Das kannst du nicht. Das ist die Hälfte der Pfeilfunktionen, die sie schließen,
this
anstatt ihre eigenen zu haben, die durch ihre Bezeichnung festgelegt werden. Für den Anwendungsfall in der Fragethis
müsste der Handler a sein , wenn Sie beim Aufrufen des Handlers von jQuery festlegen möchtenfunction
Funktion sein .Wenn Sie jedoch einen Grund für die Verwendung eines Pfeils haben (vielleicht möchten Sie ihn
this
für das verwenden, was er außerhalb des Pfeils bedeutet), können Sie ihn verwenden,e.currentTarget
anstatt,this
wenn Sie möchten :Das
currentTarget
Objekt on the event entspricht dem, was jQuerythis
beim Aufrufen Ihres Handlers festlegt .quelle
Wie Meager in seiner Antwort auf dieselbe Frage sagte Wenn Sie ES6 schreiben möchten, müssen Sie ständig ES6 schreiben .
Wenn Sie also die Pfeilfunktion von ES6: verwenden
(event)=>{}
, müssen Sie$(event.currentTarget)
stattdessen verwenden$(this)
.Sie können auch eine schönere und sauberere Art der Verwendung von currentTarget verwenden als
({currentTarget})=>{}
,Ursprünglich wurde diese Idee von Rizzi Frank in @ Meagers Antwort kommentiert , und ich fand sie nützlich und ich denke, dass nicht alle Leute diesen Kommentar lesen werden, also habe ich ihn als diese andere Antwort geschrieben.
quelle