Angenommen, ich habe die folgende Eigenschaftsmethode in einem Objekt:
%Vor% Ich brauchte ein paar Ratespiele, um herauszufinden, dass ich in der Funktion selectButtonClick
auf that
anstelle von this
verweisen musste, um auf this.classificationSelectButton
zugreifen zu können (ansonsten wird undefined
angezeigt) , aber ich bin unsicher, warum ich this
nicht verwenden kann. Meine beste Vermutung ist, dass alle Eigenschaften des Gesamtobjekts, auf die in new YAHOO.widget.Button
verwiesen wird, irgendwie den Geltungsbereich verlieren, sobald die Konstruktorfunktion aufgerufen wird.
Könnte jemand bitte erklären, warum ich classificationSelectButton
mit var that = this
referenzieren muss anstatt nur 'this.classificationSelectButton' aufzurufen?
Das Wichtigste ist, dass ein Funktionsobjekt keinen festen this
-Wert hat - der Wert von this
ändert sich je nachdem, wie die Funktion aufgerufen wird. Wir sagen, dass eine Funktion mit einem bestimmten this
-Wert aufgerufen wird. - Der this
-Wert wird zur Aufrufzeit und nicht zur Definitionszeit bestimmt.
someFunc()
), wird this
das globale Objekt ( window
in einem Browser) (oder undefined
wenn die Funktion läuft) strikter Modus). this
das aufrufende Objekt. call
oder apply
, this
wird als erstes Argument für% angegeben co_de% oder call
. apply
das Element, das das Ziel des Ereignisses ist. this
aufgerufen wird, wird new
ein neu erstelltes Objekt sein, dessen Prototyp auf die Eigenschaft this
der Konstruktorfunktion gesetzt ist. prototype
ist Operation, die Funktion wird immer und immer bind
auf das erste Argument des this
-Aufrufs gesetzt haben, der sie erzeugt hat. (Dies ist die einzige Ausnahme von der Regel "Funktionen haben keine feste bind
" - Funktionen, die von this
tatsächlich do erzeugt werden, haben eine unveränderliche bind
.) Die Verwendung von this
ist eine Möglichkeit, den var that = this;
-Wert bei Funktion definition time zu speichern (anstelle der Funktion Ausführungszeit , wenn this
irgendetwas sein kann, abhängig davon, wie die Funktion aufgerufen wurde). Die Lösung besteht darin, den äußeren Wert von this
in einer Variablen (traditionell this
oder that
) zu speichern, die im Gültigkeitsbereich der neu definierten Funktion enthalten ist, da neu definierte Funktionen Zugriff auf definierte Variablen haben in ihrem äußeren Umfang.
Weil this
seinen Wert basierend auf dem Kontext ändert, in dem es ausgeführt wird.
Innerhalb Ihrer selectButtonClick
-Funktion verweist der this
auf den Kontext dieser Funktion, nicht auf den äußeren Kontext. Sie müssen also this
im äußeren Kontext einen anderen Namen geben, auf den innerhalb der Funktion selectButtonClick
verwiesen werden kann.
Es gibt einen lexikalischen Geltungsbereich: Variablen, die in Funktionen deklariert sind, und Argumente, die an Funktionen übergeben werden, sind nur innerhalb der Funktion (ebenso wie in ihren inneren Funktionen) sichtbar.
%Vor%Die lexikalischen Regeln sind ziemlich intuitiv. Sie weisen Variablen explizit zu.
Dann gibt es einen dynamischen Bereich: this
. Es ist eine magische Sache, die ihre Bedeutung ändert, je nachdem, wie Sie eine Funktion aufrufen. Es wird auch Kontext genannt. Es gibt mehrere Möglichkeiten, eine Bedeutung zuzuweisen.
Betrachten Sie eine Funktion:
%Vor% Erstens , der Standardkontext ist undefined
in strict mode und das globale Objekt im normalen Modus:
Zweitens können Sie eine Methode erstellen und sie mit einem Verweis auf ein Objekt aufrufen, gefolgt von einem Punkt gefolgt von einem Verweis auf die Funktion:
%Vor%Beachten Sie, dass der Kontext, wenn Sie die Methode ohne den Punkt aufrufen, auf den Standardwert zurückfällt:
%Vor% Schließlich gibt es eine Möglichkeit, einen Kontext mithilfe von entweder call
/ apply
oder bind
:
Um den Kontext besser zu verstehen, möchten Sie vielleicht mit so einfachen Beispielen experimentieren. John Resig hat sehr schöne interaktive Folien zum Kontext in JavaScript, wo Sie selbst lernen und testen können.
Wenn Sie es in einer Variablen speichern, können Sie auf andere Bereiche zugreifen, in denen sich this
auf etwas anderes beziehen kann.
Siehe Ссылка , Ссылка und Was ist der Umfang der Variablen in JavaScript? ? für weitere Informationen zum Schlüsselwort this
.
Der Verweis this
funktioniert nicht, wenn eine Methode einer Klasse von einem DOM-Ereignis aufgerufen wird. Wenn eine Methode eines Objekts beispielsweise als Ereignisbehandlungsroutine für onclick verwendet wird, verweist der this
-Zeiger auf den DOM-Knoten, an dem das Ereignis aufgetreten ist. Sie müssen also eine private Sicherung von this
im Objekt erstellen.
Tags und Links javascript