Das Schlüsselwort „this' verstehen

PHPz
Freigeben: 2023-08-30 17:05:09
Original
874 Leute haben es durchsucht

Das Schlüsselwort „this verstehen

Wenn Sie eine Funktion erstellen, erstellt diese einen Bereich mit dem Namenthis的关键字(在幕后),该关键字链接到函数运行的对象。换句话说,this, der für ihre Funktion verwendet werden kann, aber es handelt sich um einen Verweis auf das Objekt, das die Funktion als Eigenschaft oder Methode hat.

Werfen wir einen Blick auf diecodyObjekte aus dem vorherigen Artikel:

Beispiel: sample98.html

Nach dem Login kopieren

Beachten Sie, wie wir innerhalb der FunktiongetGenderauf die Eigenschaftgendermithilfe der Punktnotation (cody.gender) amgetGender函数内部,我们如何在cody对象本身上使用点表示法 (cody.gender) 访问gender属性。可以使用this重写来访问cody对象,因为this指向cody-Objekt selbst zugreifen. Auf das

-Objekt kann mit der

-Überschreibung zugegriffen werden, da

auf das

-Objekt zeigt.this.gender中使用的this

Beispiel: sample99.html

Nach dem Login kopieren
this的主题可能会令人困惑,但事实并非如此。请记住,一般来说, this在函数内部使用来引用该函数所包含的对象,而不是函数本身(例外情况包括使用 new关键字或 call()应用()

bezieht sich lediglich auf das Cody-Objekt, das die Funktion ausführt.

this

).

Dasarguments和发送到函数的任何参数相反,thisSchlüsselwort

sieht aus und verhält sich wie jede andere Variable, außer dass Sie es nicht ändern können.

Im Gegensatz zuargumentsund allen an eine Funktion gesendeten Argumententhissind Schlüsselwörter (keine Eigenschaften) im aufrufenden/aktivierenden Objekt.

Wie wird der Wert vonthis

ermittelt?

myObject对象被赋予一个名为 sayFoo 的属性,该属性指向sayFoo函数。当从全局范围调用sayFoo函数时,this引用window对象。当作为 myObject 的方法调用时,this指的是myObjectDer an alle Funktionen übergebene Wert von

basiert auf dem Kontext, in dem die Funktion zur Laufzeit aufgerufen wird. Seien Sie hier aufmerksam, denn es ist eine dieser Macken, an die Sie sich einfach erinnern müssen.

myObject有一个名为fooDemmyObject-Objekt im folgenden Codebeispiel wird eine Eigenschaft namens sayFoo zugewiesen, die auf die FunktionsayFooverweist. Wenn die FunktionsayFooaus dem globalen Bereich aufgerufen wird, verweist

auf das

-Objekt. Beim Aufruf als Methode von myObject bezieht sich

auf myObject.

this的值基于调用该函数的上下文。考虑myObject.sayFoosayFoo都指向相同的函数。但是,根据调用sayFoo()的位置(上下文),thisWird aufgrund der Eigenschaften von

verwendet.

windowBeispiel: sample100.html

Nach dem Login kopieren

Offensichtlich basiert der Wert von

auf dem Kontext, in dem die Funktion aufgerufen wird. Bedenken Sie, dass myObject.sayFoound sayFoobeide auf dieselbe Funktion verweisen. Je nachdem, wo (Kontext) sayFoo()aufgerufen wird, unterscheidet sich der Wert von

jedoch.

Wenn es hilft, hier ist derselbe Code, der das Header-Objekt explizit verwendet (thisarguments).


Beispiel: sample101.html

Nach dem Login kopieren
thisStellen Sie sicher, dass Sie sich beim Übergeben einer Funktion oder beim Erstellen mehrerer Verweise auf eine Funktion darüber im Klaren sind, dass sich der Wert davon abhängig vom Kontext ändert, in dem Sie die Funktion aufrufen.

Alle Variablen außerthis在一个包含在另一个函数中的函数内部使用时会发生什么。坏消息是在 ECMA 3 中,this迷失了方向并引用了头对象(浏览器中的windowundargumentsrespektieren den lexikalischen Geltungsbereich

func2func3中的this迷失了方向,并且不是指向myObject

Das Schlüsselwort bezieht sich auf das Header-Objekt in der verschachtelten Funktion

Sie fragen sich vielleicht, was passiert, wenn

in einer Funktion verwendet wird, die in einer anderen Funktion enthalten ist. Die schlechte Nachricht ist, dass

in ECMA 3 verloren gegangen ist und auf das Header-Objekt (das

-Objekt im Browser) verwiesen hat, anstatt auf das Objekt, in dem die Funktion definiert ist.foo.func1时会发生什么。当在foo.func1(函数中的函数)内部调用匿名函数时,匿名函数内部的this

Im folgenden Code gehen die

infunc2undfunc3verloren und verweisen nicht aufmyObject, sondern auf das Hauptobjekt.

Beispiel: sample102.htmlthis

Nach dem Login kopieren

Die gute Nachricht ist, dass dieses Problem in ECMAScript 5 gelöst wird. Mittlerweile sollten Sie sich dieses Dilemmas bewusst sein, insbesondere wenn Sie anfangen, Funktionen als Werte an andere Funktionen zu übergeben.

Betrachten Sie das nächste Beispiel und was passiert, wenn Sie eine anonyme Funktion anfoo.func1übergeben. Wenn eine anonyme Funktion innerhalb vonfoo.func1(einer Funktion innerhalb einer Funktion) aufgerufen wird, ist der

-Wert innerhalb der anonymen Funktion ein Verweis auf das Hauptobjekt.

this值不会丢失,您可以简单地使用作用域链在父函数中保留对this的引用。以下示例演示了如何使用名为thatBeispiel: sample103.html

Nach dem Login kopieren

Jetzt vergessen Sie nie: Der

-Wert ist immer ein Verweis auf das Hauptobjekt, wenn seine Hostfunktion in eine andere Funktion eingeschlossen oder im Kontext einer anderen Funktion aufgerufen wird (auch dies ist in ECMAScript 5 behoben). Verwenden Sie die Bereichskette, um das Problem verschachtelter Funktionen zu lösen Damit der -Wert nicht verloren geht, können Sie einfach eine Bereichskette verwenden, um einen Verweis auf in der übergeordneten Funktion beizubehalten. Das folgende Beispiel zeigt, wie wir den Funktionskontext besser verfolgen können, indem wir eine Variable mit dem Namen thatverwenden und ihren Gültigkeitsbereich nutzen. Beispiel: sample104.html
Nach dem Login kopieren

使用call()apply()控制this的值

this的值通常由调用函数的上下文确定(除非使用 new 关键字,稍后会详细介绍),但您可以使用this的值>apply()或call()来定义调用函数时this指向什么对象。使用这些方法就像在说:“嘿,调用 X 函数,但告诉该函数使用 Z 对象作为this的值。”通过这样做,JavaScript 确定this值的默认方式将被覆盖。

在下一个示例中,我们创建一个对象和一个函数。然后我们通过call()调用该函数,以便函数内this的值使用myObject作为其上下文。myFunction函数内的语句将使用属性填充myObject,而不是填充头对象。我们更改了this(在myFunction内部)引用的对象。

示例:sample105.html

Nach dem Login kopieren

在前面的示例中,我们使用了call(),但也可以使用apply()。两者之间的区别在于函数参数的传递方式。使用call(),参数只是逗号分隔的值。使用apply(),参数值在数组内部传递,如以下示例所示。

示例:sample106.html

Nach dem Login kopieren

这里您需要学习的是,您可以覆盖 JavaScript 在函数作用域中确定this值的默认方式。


在用户定义的构造函数中使用this关键字

当使用new关键字调用函数时,构造函数中声明的this的值指的是实例本身。换句话说:在构造函数中,我们可以在实际创建对象之前通过this来利用该对象。在这种情况下,this的默认值的更改方式类似于使用call()apply()

在下面的示例中,我们设置了一个Person构造函数,该函数使用this来引用正在创建的对象。当创建Person的实例时,this.name将引用新创建的对象,并在新对象中放置一个名为 name 的属性,并将参数 (name) 中的值传递给构造函数。

示例:sample107.html

Nach dem Login kopieren

同样,当使用new关键字调用构造函数时,this指的是“将成为的对象”。如果我们没有使用new关键字,则this的值将是调用Person的上下文 - 在本例中为头对象。让我们看一下以下场景:

示例:sample108.html

Nach dem Login kopieren

原型方法中的关键字this引用构造函数实例

当在添加到构造函数prototype属性的函数中使用时,this指的是调用该方法的实例。假设我们有一个自定义Person()构造函数。作为参数,它需要人的全名。如果我们需要访问人员的全名,我们将whatIsMyFullName方法添加到Person.prototype中,以便所有Person实例继承该方法。当使用this时,该方法可以引用调用它的实例(以及它的属性)。

这里我演示了创建两个Person对象(codylisa)以及继承的whatIsMyFullName方法,其中包含this关键字来访问实例。

示例:sample109.html

Nach dem Login kopieren

结论

这里要带走的概念是that关键字 this 用于在prototype对象中包含的方法内部使用时引用实例。如果实例不包含该属性,则开始查找原型。

如果this指向的实例或对象不包含所引用的属性,则应用适用于任何属性查找的相同规则,并且将在原型链上“查找”该属性。因此,在我们的示例中,如果fullName属性未包含在我们的实例中,则将在Person.prototype.fullName中查找fullName属性,然后在Object.prototype.fullName中查找。

Das obige ist der detaillierte Inhalt vonDas Schlüsselwort „this' verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!