Ich habe jetzt eine Weile mit ES6 experimentiert und bin gerade auf ein kleines Problem gestoßen.
Ich benutze sehr gerne Pfeilfunktionen und wann immer ich kann, benutze ich sie.
Es scheint jedoch, dass Sie sie nicht binden können!
Hier ist die Funktion:
var f = () => console.log(this);
Hier ist das Objekt, an das ich die Funktion binden möchte:
var o = {'a': 42};
Und hier ist , wie ich binden f
an o
:
var fBound = f.bind(o);
Und dann kann ich einfach anrufen fBound
:
fBound();
Welches wird dies (das o
Objekt) ausgeben :
{'a': 42}
Cool! Schön! Nur dass es nicht funktioniert. Anstatt das o
Objekt auszugeben, wird das Objekt ausgegeben window
.
Ich würde gerne wissen: Können Sie Pfeilfunktionen binden? (Und wenn ja, wie?)
Ich habe den obigen Code in Google Chrome 48 und Firefox 43 getestet und das Ergebnis ist das gleiche.
javascript
function
ecmascript-6
Florrie
quelle
quelle
this
übergeordneten Bereich verwenden.Antworten:
Sie können eine Pfeilfunktion nicht erneut binden
this
. Es wird immer als der Kontext definiert, in dem es definiert wurde. Wenn Siethis
aussagekräftig sein möchten, sollten Sie eine normale Funktion verwenden.Aus der ECMAScript 2015-Spezifikation :
quelle
this
. Die beiden sind verwandt, aber nicht gleich.this
Innerhalb einer Pfeilfunktion "erbt" die Funktion immerthis
vom umschließenden Bereich. Das ist ein Merkmal von Pfeilfunktionen. Sie können aber nochbind
alle anderen Parameter einer Pfeilfunktion verwenden. Nur nichtthis
.Um vollständig zu sein, können Sie die Pfeilfunktionen neu binden und die Bedeutung von einfach nicht ändern
this
.bind
hat noch Wert für Funktionsargumente:Probieren Sie es hier aus: http://jsbin.com/motihanopi/edit?js,console
quelle
this
(was natürlich lexikalisch definiert ist)?Aus dem MDN :
Dies bedeutet, dass Sie einen Wert nicht an einen
this
gewünschten Wert binden können .quelle
Jahrelang hatten js-Entwickler Probleme mit der Kontextbindung und fragten, warum
this
sich Javascript geändert habe, was im Laufe der Jahre aufgrund der Kontextbindung und des Unterschieds zwischen der Bedeutung vonthis
Javascript und denthis
meisten anderen OOP-Sprachen zu großer Verwirrung geführt habe .All dies führt mich zu der Frage, warum, warum! Warum sollten Sie eine Pfeilfunktion nicht erneut binden? Diese wurden speziell entwickelt, um all diese Probleme und Verwirrungen zu lösen und zu vermeiden, dass der Funktionsumfang verwendet werden muss
bind
oder aufcall
andere Weise.TL; DR
Nein, Sie können Pfeilfunktionen nicht neu binden.
quelle
this
ist nicht funktionsfähig. Lambdas sollten seinarguments => output
. Wenn Sie einen externen Kontext benötigen, geben Sie ihn weiter. Die bloße Existenz vonthis
hat den gesamten Einstieg in die Sprache erleichtert. Ohne ihn hätten Sie den Begriff "Javascript-Klasse" nie gehört.this
.Sie können
bind
den Wertthis
innerhalb einer Pfeilfunktion nicht ändern . Sie können jedoch eine neue reguläre Funktion erstellen, die das Gleiche wie die alte Pfeilfunktion tut, und dann wie gewohnt verwendencall
oderbind
neu bindenthis
.Wir verwenden hier einen
eval
Aufruf, um die Pfeilfunktion, die Sie als normale Funktion übergeben, neu zu erstellen und sie danncall
mit einer anderen Funktion aufzurufenthis
:quelle
Lösen Sie ES6-Pfeilfunktionen wirklich "dies" in JavaScript
Der obige Link erklärt, dass sich die Pfeilfunktionen
this
nicht mit denbind, call, apply
Funktionen ändern .Es wird mit einem sehr schönen Beispiel erklärt.
Führen Sie dies aus
node v4
, um das "erwartete" Verhalten zu sehen.quelle
Ich habe die gleiche Frage vor ein paar Tagen gestellt.
Sie können keinen Wert binden, da der
this
bereits gebunden ist.Unterschiedliche Bindung dieses Bereichs an den Funktionsoperator ES6 =>
quelle
this
ist auch gebunden. Der Punkt ist, dass es in Pfeilfunktionen keine lokale Bindung hat.Kurz gesagt, Sie können keine Pfeilfunktionen binden, aber lesen Sie weiter:
Stellen Sie sich vor, Sie haben diese Pfeilfunktion, unter der
this
auf der Konsole gedruckt wird:Die schnelle Lösung hierfür wäre die Verwendung der normalen Funktion. Ändern Sie sie einfach in:
Dann können Sie es mit
bind
odercall
oder an jede lexikalische Umgebung bindenapply
:und nenne es im Falle von
bind
.Es gibt auch Möglichkeiten, dies
eval()
zu tun, was dringend nicht empfohlen wird .quelle
function myFunc
ist verhaltensmäßig anders als bindbar; ein engeres Spiel wäreconst myFunc = function() {...}
. Ich bin auch neugierig, was Sie mit eval meinen, da dies ein Ansatz ist, von dem ich glaube, dass hier noch keine Antworten geteilt wurden. Es wäre interessant zu sehen, wie das gemacht wird, und dann zu lesen, warum es so stark entmutigt ist.Vielleicht hilft Ihnen dieses Beispiel:
quelle