Javascript-Bereich mit "var that = this" [duplizieren]

8

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?

    
Scott 11.09.2012, 13:29
quelle

6 Antworten

62

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.

  • Wenn die Funktion als "rohe" Funktion aufgerufen wird (zB someFunc() ), wird this das globale Objekt ( window in einem Browser) (oder undefined wenn die Funktion läuft) strikter Modus).
  • Wenn es als Methode für ein Objekt aufgerufen wird, ist this das aufrufende Objekt.
  • Wenn Sie eine Funktion mit call oder apply , this wird als erstes Argument für% angegeben co_de% oder call .
  • Wenn es als Ereignis-Listener aufgerufen wird (wie hier), ist apply das Element, das das Ziel des Ereignisses ist.
  • Wenn es als Konstruktor mit this aufgerufen wird, wird new ein neu erstelltes Objekt sein, dessen Prototyp auf die Eigenschaft this der Konstruktorfunktion gesetzt ist.
  • Wenn die Funktion das Ergebnis einer 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.

    
apsillers 11.09.2012, 13:42
quelle
5

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.

    
Gareth 11.09.2012 13:32
quelle
3

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:

%Vor%

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 :

%Vor%

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.

    
katspaugh 11.09.2012 13:47
quelle
1

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 .

    
Stefan 11.09.2012 13:34
quelle
1

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.

    
Philipp 11.09.2012 13:36
quelle
1

Dies ist ein Schlüsselwort in JavaScript, keine Standardvariable, die in jeder Funktion definiert ist. Daher wird, wie Gareth sagte, dies auf den Kontext verweisen, in dem die Funktion ist aufgerufen oder das globale Objekt, wenn kein Kontext vorhanden ist.

    
Bax 11.09.2012 13:44
quelle

Tags und Links