Warum kann Lambda nicht zur Definition der Prototyp-Funktion verwendet werden?

8

Kann jemand bitte erklären, warum das Definieren einer Prototyp-Funktion mit Lambda-Ausdruck nicht funktioniert? Ich dachte, das muss vorher gefragt werden, konnte es aber nicht finden.

%Vor%

das funktioniert nicht

%Vor%

und das ist natürlich in Ordnung:

%Vor%     
stt106 26.03.2016, 10:43
quelle

3 Antworten

11

Eines der Hauptmerkmale von Pfeilfunktionen ist, dass sie über das this aus dem Kontext schließen, in dem sie erstellt wurden. Sie bekommen es nicht basierend darauf, wie sie aufgerufen werden, wie andere Funktionen es tun. Also ...

%Vor%

Aber Ihre Funktion hängt davon ab, dass this davon abhängt, wie sie aufgerufen wird.

Dies ist kein Anwendungsfall für Pfeilfunktionen. Verwenden Sie eine normale Funktion:

%Vor%

Oder noch besser: Verwenden Sie die neue class -Syntax:

%Vor%     
T.J. Crowder 26.03.2016, 10:50
quelle
7

Arrow function würde den Kontext auflösen this gehört zu dem Bereich, in dem die Funktion definiert wurde. Ich glaube, Sie haben diese Funktion in window scope definiert. Der this zeigt also in Ihrer Funktion auf window .

Sie können hier normal anonymous function verwenden. Und wir müssen bei der Verwendung von Pfeilfunktionen vorsichtig sein.

    
Rajaprabhu Aravindasamy 26.03.2016 10:47
quelle
0

Zusätzlich zu @ tj-crowder steht answer , ich wollte einen Testfall (mocha assert) hinterlassen, mit dem man sich vorstellen kann, was nicht funktioniert.

Sie können hier auch mehr über den Umfang der Pfeilfunktionen lesen: Du kennst JS nicht von Kyle Simpson, der this im Detail erklärt.

Grundsätzlich zeigt this einer Pfeilfunktion auf den umgebenden Kontext des aktuellen Kontextes, was praktisch ist, wenn Sie umschließende Funktionen haben. Was es macht, ist im Grunde genommen das var self = this; Ding.

Oder wie Kyle sagt:

  

[...]   Lexical this im Pfeilfunktions-Callback im vorherigen Snippet zeigt nun auf denselben Wert wie in der umschließenden makeRequest(..) -Funktion. Mit anderen Worten, => ist eine syntaktische Stand-in für var self = this .

     

In Fällen, in denen var self = this (oder alternativ eine Funktion .bind(this) call) normalerweise hilfreich wäre, sind => arrow-Funktionen eine bessere Alternative, die nach dem gleichen Prinzip arbeitet. [...]

Sie können es selbst testen mit meinem Kern: Ссылка

In meinem Testfall war das die Ausgabe:

%Vor%

BEARBEITEN: hinzugefügtes Beispiel / Referenz zu Kyle Simpsons "Du weißt ES6 nicht" Ссылка

    
jayjay bricksoft 21.10.2016 13:55
quelle

Tags und Links