Das Schlüsselwort this

Wenn eine Funktion erstellt wird, wird ein Schlüsselwort aufgerufen diese erstellt (hinter den Kulissen), die mit dem Objekt verknüpft sind, in dem die Funktion ausgeführt wird. Anders gesagt, diese steht für den Umfang ihrer Funktion zur Verfügung, ist jedoch ein Verweis auf das Objekt, dessen Funktion oder Eigenschaft eine Eigenschaft oder Methode ist.

Schauen wir uns das an cody Objekt aus einem vorherigen Artikel:

Beispiel: sample98.html

 

Beachten Sie, wie in der getGender Funktion, wir greifen auf die Geschlecht Eigenschaft mit Punktnotation (cody.gender) auf der cody Objekt selbst. Dies kann mit neu geschrieben werden diese Zugriff auf die cody Objekt weil diese zeigt auf die cody Objekt.

Beispiel: sample99.html

 

Das diese benutzt in this.gender bezieht sich einfach auf das Objekt, an dem die Funktion ausgeführt wird.

Das Thema von diese kann verwirrend sein, muss aber nicht sein. Denken Sie daran, im Allgemeinen, diese wird innerhalb von Funktionen verwendet, um auf das Objekt zu verweisen, in dem sich die Funktion befindet, im Gegensatz zu der Funktion selbst (Ausnahmen schließen die Verwendung von ein Neu Schlüsselwort oder Anruf() und sich bewerben()).

Das Schlüsselwort diese sieht und verhält sich wie jede andere Variable, es sei denn, Sie können sie nicht ändern.

Im Gegensatz zu Argumente und alle an die Funktion gesendeten Parameter, diese ist ein Schlüsselwort (keine Eigenschaft) im Aufruf- / Aktivierungsobjekt.


Wie ist der Wert von diese Entschlossen?

Der Wert von diese, an alle Funktionen übergeben, basiert auf dem Kontext, in dem die Funktion zur Laufzeit aufgerufen wird. Passen Sie hier auf, denn dies ist eine der Macken, die Sie nur auswendig lernen müssen.

Das meinObjekt Das Objekt im folgenden Codebeispiel erhält eine Eigenschaft namens sayFoo, die auf das Symbol zeigt sayFoo Funktion. Wenn der sayFoo Funktion wird aus dem globalen Bereich aufgerufen, diese bezieht sich auf Fenster Objekt. Wenn es als Methode von myObject aufgerufen wird, diese bezieht sich auf meinObjekt.

Schon seit meinObjekt hat eine Eigenschaft namens foo, diese Eigenschaft wird verwendet.

Beispiel: sample100.html

 

Der Wert von diese basiert auf dem Kontext, in dem die Funktion aufgerufen wird. Betrachten Sie das beide myObject.sayFoo und sayFoo auf die gleiche Funktion zeigen. Je nachdem wo (der Kontext) sayFoo () wird von aufgerufen, der Wert von diese ist anders.

Wenn es hilft, ist hier derselbe Code mit dem Kopfobjekt (Fenster) explizit verwendet.

Beispiel: sample101.html

 

Stellen Sie sicher, dass Sie beim Weitergeben von Funktionen oder bei mehreren Verweisen auf eine Funktion feststellen, dass sich der Wert dieser Funktion je nach Kontext ändert, in dem Sie die Funktion aufrufen.

Alle Variablen außer diese und Argumente lexikalischen Bereich folgen


Das diese Schlüsselwort bezieht sich auf das Hauptobjekt in verschachtelten Funktionen

Sie fragen sich vielleicht, was passiert diese wenn es innerhalb einer Funktion verwendet wird, die in einer anderen Funktion enthalten ist. Die schlechte Nachricht ist in ECMA 3, diese verliert seinen Weg und verweist auf das Kopfobjekt (das Fenster Objekt in Browsern) anstelle des Objekts, in dem die Funktion definiert ist.

Im folgenden Code, diese Innen func2 und func3 verliert seinen Weg und verweist nicht auf meinObjekt sondern stattdessen zum Kopfobjekt.

Beispiel: sample102.html

 

Die gute Nachricht ist, dass dies in ECMAScript 5 behoben wird. Im Moment sollten Sie sich dieser Missstände bewusst sein, insbesondere wenn Sie beginnen, Funktionen als Werte an andere Funktionen zu übergeben.

Betrachten Sie das nächste Beispiel und was passiert, wenn Sie eine anonyme Funktion übergeben foo.func1. Wenn die anonyme Funktion innerhalb von aufgerufen wird foo.func1 (eine Funktion innerhalb einer Funktion), die diese Der Wert innerhalb der anonymen Funktion ist eine Referenz auf das Kopfobjekt.

Beispiel: sample103.html

 

Jetzt wirst du nie vergessen: die diese value ist immer eine Referenz auf das head-Objekt, wenn seine Host-Funktion in einer anderen Funktion gekapselt oder im Kontext einer anderen Funktion aufgerufen wird (dies ist wiederum in ECMAScript 5 festgelegt)..


Umgehen des geschachtelten Funktionsproblems durch Nutzung der Scope-Kette

So, dass die diese Wenn der Wert nicht verloren geht, können Sie einfach die Gültigkeitsbereichskette verwenden, um einen Verweis darauf zu behalten diese in der übergeordneten Funktion. Das folgende Beispiel veranschaulicht, wie eine aufgerufene Variable verwendet wird Das, Durch den Einsatz dieses Bereichs können wir den Funktionskontext besser nachverfolgen.

Beispiel: sample104.html

 

Den Wert von kontrollieren diese Verwenden Anruf() oder sich bewerben()

Der Wert von diese wird normalerweise aus dem Kontext bestimmt, in dem eine Funktion aufgerufen wird (außer wenn das neue Schlüsselwort dazu verwendet wird, mehr dazu in einer Minute), aber Sie können den Wert von überschreiben und steuern diese mit sich bewerben() oder Anruf() um welches Objekt zu definieren diese zeigt auf, wenn eine Funktion aufgerufen wird. Die Verwendung dieser Methoden ist wie ein Satz: "Hey, rufen Sie die X-Funktion auf, aber sagen Sie der Funktion, dass sie das Z-Objekt als Wert für verwenden soll diese."Auf diese Weise bestimmt JavaScript standardmäßig den Wert von diese wird überschrieben.

Im nächsten Beispiel erstellen wir ein Objekt und eine Funktion. Wir rufen dann die Funktion über auf Anruf() so dass der Wert von diese innerhalb der Funktion verwendet meinObjekt als sein Kontext. Die Aussagen im meineFunktion Funktion wird dann aufgefüllt meinObjekt mit Eigenschaften, anstatt das Kopfobjekt aufzufüllen. Wir haben das Objekt zu dem geändert diese (Innen meineFunktion) bezieht.

Beispiel: sample105.html

 

Im vorherigen Beispiel haben wir verwendet Anruf(), aber sich bewerben() könnte auch verwendet werden. Der Unterschied zwischen den beiden ist, wie die Parameter für die Funktion übergeben werden. Verwenden Anruf(), Die Parameter sind nur durch Kommas getrennte Werte. Verwenden sich bewerben(), Die Parameterwerte werden innerhalb eines Arrays übergeben, wie im folgenden Beispiel gezeigt.

Beispiel: sample106.html

 

Sie müssen hier lernen, dass Sie die Standardmethode überschreiben können, mit der JavaScript den Wert von bestimmt diese in einem Funktionsumfang.


Verwendung der diese Schlüsselwort in einer benutzerdefinierten Konstruktorfunktion

Wenn eine Funktion mit der aufgerufen wird Neu Schlüsselwort, der Wert von diese wie im Konstruktor angegeben, bezieht es sich auf die Instanz selbst. Anders gesagt: In der Konstruktorfunktion können wir das Objekt über nutzen diese bevor das Objekt tatsächlich erstellt wird. In diesem Fall ist der Standardwert von diese ändert sich ähnlich wie bei Anruf() oder sich bewerben().

Im folgenden Beispiel richten wir ein Person Konstruktorfunktion, die verwendet diese auf ein Objekt verweisen, das gerade erstellt wird. Wenn eine Instanz von Person geschaffen, dieser Name referenziert das neu erstellte Objekt und platziert eine Eigenschaft namens name im neuen Objekt mit einem Wert aus dem Parameter (Name) wurde an die Konstruktorfunktion übergeben.

Beispiel: sample107.html

 

Nochmal, diese bezieht sich auf das "Objekt, das sein soll", wenn die Konstruktorfunktion mit der Funktion aufgerufen wird Neu Stichwort. Hätten wir das nicht benutzt Neu Schlüsselwort, der Wert von diese wäre der Kontext in dem Person wird aufgerufen - in diesem Fall das Kopfobjekt. Schauen wir uns das folgende Szenario an:

Beispiel: sample108.html

 

Das Schlüsselwort diese Innerhalb einer Prototypmethode Bezieht sich auf eine Konstruktorinstanz

Bei Verwendung in Funktionen, die zu Konstruktoren hinzugefügt wurden Prototyp Eigentum, diese bezieht sich auf die Instanz, in der die Methode aufgerufen wird. Sagen wir, wir haben einen Brauch Person() Konstruktorfunktion. Als Parameter wird der vollständige Name der Person benötigt. Falls wir auf den vollständigen Namen der Person zugreifen müssen, fügen Sie ein whatIsMyFullName Methode zum Person.Prototyp so dass alle Person Instanzen erben die Methode. Beim Benutzen diese, Die Methode kann sich auf die Instanz beziehen, die sie aufruft (und damit auf ihre Eigenschaften)..

Hier zeige ich die Schaffung von zwei Person Objekte (cody und Lisa) und das geerbte whatIsMyFullName Methode, die das Schlüsselwort this enthält, um auf die Instanz zuzugreifen.

Beispiel: sample109.html

 

Fazit

Das Konzept zum Mitnehmen ist hier Das Das Schlüsselwort this wird verwendet, um auf Instanzen zu verweisen, die innerhalb einer in der Methode enthaltenen Methode verwendet werden Prototyp Objekt. Wenn die Instanz die Eigenschaft nicht enthält, beginnt die Prototypsuche.

Wenn die Instanz oder das Objekt durch angezeigt wurde diese Enthält die Eigenschaft, auf die verwiesen wird, nicht, werden dieselben Regeln angewendet, die für jede Eigenschaftssuche gelten, und die Eigenschaft wird in der Prototypkette "nachgeschlagen". Also in unserem Beispiel, wenn die vollständiger Name Eigentum war nicht in unserer Instanz enthalten, vollständiger Name würde gesucht werden Person.prototype.fullName, dann Object.prototype.fullName.