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.
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
diese
Schlüsselwort bezieht sich auf das Hauptobjekt in verschachtelten FunktionenSie 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)..
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
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.
diese
Schlüsselwort in einer benutzerdefinierten KonstruktorfunktionWenn 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
diese
Innerhalb einer Prototypmethode Bezieht sich auf eine KonstruktorinstanzBei 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
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
.