Dies ist die neue JavaScript arrow function Notation. Die Linie, die Sie zitiert ist fast gleichbedeutend mit diesem Stück Code in der traditionellen Funktion Notation:
setTimeout(function() {
this.active = true;
}, 0);
jedoch in der traditionellen Notation wird this
auf das globale Objekt (außerhalb der strengen Modus gebunden werden - im Strict-Modus, Sie wird eine ReferenceError
erhalten, aufgrund der wie diese in Ausführungskontexten funktioniert. Die traditionelle Problemumgehung vor der Einführung der Pfeil Funktionen wäre:
var self = this;
setTimeout(function() {
self.active = true;
}, 0)
Pfeil Funktionen lösen dieses Problem durch lexikalisch this
Bindung, ebenso wie jede andere Variable, anstatt ihre eigenen definieren. Neben der Behandlung von this
definieren Pfeilfunktionen implizit auch nicht ihre eigenen Variablen arguments
oder super
, sondern binden sie lexikalisch.
Graben tiefer, was macht newHero()
tun? Es ist eine Konstruktorfunktion. Wenn Sie es aufrufen, wird ein neues Objekt zugeordnet, auf das innerhalb des Funktionskörpers durch die Variable this
verwiesen werden kann. Der Konstruktor legt zwei Eigenschaften für das Objekt this
fest; Diese Eigenschaften sind .model
und .active
, wobei spezifische Werte angegeben werden.
Der Ausdruck (() => this.active = true)
erstellt ein Funktionsobjekt. Es beschreibt, was zu einem späteren Zeitpunkt ausgeführt werden sollte. Wenn das Funktionsobjekt aufgerufen wird, wird der Körper ausgeführt. Die Codezeile erstellt also das Funktionsobjekt und gibt es an setTimeout()
, das das Funktionsobjekt nach der angegebenen Zeit - in diesem Fall 0 Millisekunden - aufrufen wird.
Beachten Sie, dass "this" in Ihrer Antwort außerhalb des strikten Modus an das globale Objekt gebunden wird oder im strikten Modus einen Referenzfehler ergibt. Reguläre Funktionen binden dafür ihren eigenen Wert, während Pfeilfunktionen dies lexikalisch binden: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions –
@JohannesH. Danke, ich habe nicht bemerkt, dass es subtile semantische Fehler gab, die Pfeilfunktionen und 'dieses' beinhalten. Ich bin nicht gut genug informiert, um meine Erklärung zu klären. Kannst du mir helfen, die Antwort zu korrigieren, um richtiger zu sein? – Nayuki
Beachten Sie, dass Pfeilfunktionen nur eine abgekürzte Syntax für Funktionsausdrücke sind (und lexikalisch * this *), Lambda-Funktionen haben in JavaScript immer existiert. – RobG