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 haben nicht this
, wenn sie erstellt werden 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:
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
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()
:
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%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.
Tags und Links javascript ecmascript-6 this arrow-functions