Pfeilfunktionen und das [duplizieren]

8

Ich probiere ES6 aus und möchte so eine Eigenschaft in meine Funktion einfügen

%Vor%

Wenn ich diese Code-Konsole ausführe, logge ich jedoch nur my name is . Was mache ich falsch?

    
jason328 01.03.2015, 19:55
quelle

5 Antworten

19

Kurze Antwort: this Punkte auf die nächste Grenze this - im angegebenen Code this befindet sich im umschließenden Bereich.

Längere Antwort: Pfeilfunktionen binden ihre this , wenn sie erstellt werden haben nicht this , arguments oder andere spezielle Namen, die an alle gebunden sind - wenn das Objekt erstellt wird, wird der Name this im umschließenden Bereich gefunden, nicht das person Objekt. Sie können dies deutlicher sehen, wenn Sie die Deklaration verschieben:

%Vor%

Und noch deutlicher, wenn es in eine vage Annäherung der Pfeilsyntax in ES5 übersetzt wird:

%Vor%

In beiden Fällen verweist this (für die Funktion shout) auf denselben Bereich, in dem person definiert ist, und nicht auf den neuen Bereich, an den die Funktion angefügt ist, wenn sie dem Objekt person hinzugefügt wird.

Sie können keine Pfeilfunktionen auf diese Weise ausführen, aber wie @kamituel in seine Antwort , Sie können den Vorteil des kürzeren Methodendeklarationsmusters in ES6 nutzen, um ähnliche Platzeinsparungen zu erzielen:

%Vor%     
Sean Vieira 01.03.2015, 19:59
quelle
15

Vereinbart mit @Sean Vieira - in diesem Fall ist this an das globale Objekt gebunden (oder, wie im Kommentar erwähnt, allgemeiner an einen umschließenden Bereich).

Wenn Sie eine kürzere Syntax haben möchten, gibt es eine andere Option - erweiterte Objektliterale unterstützen kurze Syntax für Eigenschaftsfunktionen. this wird gebunden, wie Sie es erwarten. Siehe shout3() :

%Vor%     
kamituel 01.03.2015 20:04
quelle
2

Hier wird der Wert dieses innerhalb der Funktion bestimmt durch, wo die Pfeilfunktion definiert ist, nicht wo sie verwendet wird.

So this bezieht sich auf globales / window-Objekt, wenn es nicht in anderen Namespaces eingeschlossen ist

    
A.B 01.03.2015 20:04
quelle
0

Das Problem ist das ( MDN )

  

Ein Pfeilfunktionsausdruck [...] bindet den Wert lexikalisch.

     

Pfeilfunktionen erfassen den Wert des umschließenden Kontextes.

Daher ist der Wert von this in dieser Funktion der Wert von this , in dem Sie das Objektliteral erstellen. Wahrscheinlich wird das window im nicht-strikten Modus und undefined im strikten Modus sein.

Um es zu beheben, sollten Sie eine normale Funktion verwenden:

%Vor%     
Oriol 01.03.2015 20:06
quelle
0

Die angenommene Antwort ist ausgezeichnet, prägnant und klar, aber ich werde ein wenig darauf eingehen, was Sean Vieira sagte:

  

Pfeilfunktionen haben keine   diese Argumente oder andere spezielle Namen sind überhaupt nicht gebunden.

Da die Pfeilfunktion kein "this" hat, verwendet sie das "this" des Elternteils. "this" zeigt immer auf das übergeordnete Element, und das übergeordnete Objekt des Personenobjekts ist Window (wenn Sie sich in einem Browser befinden).

Um es zu beweisen, führen Sie dies in Ihrer Konsole aus:

%Vor%

Sie erhalten das Window-Objekt.

Ich finde das eine wirklich hilfreiche Art, darüber nachzudenken. Es ist nicht die ganze Geschichte, als was das "Dies" eines Objekt-Literals ist, ist eine andere Diskussion.

    
Tenbrink 29.06.2017 22:41
quelle