Ich habe festgestellt, dass es anscheinend keine klare Erklärung dafür gibt, was das this
Schlüsselwort ist und wie es in JavaScript auf der Stack Overflow-Site korrekt (und falsch) verwendet wird.
Ich habe ein sehr seltsames Verhalten damit gesehen und nicht verstanden, warum es aufgetreten ist.
Wie funktioniert this
und wann sollte es verwendet werden?
javascript
this
Maxim Gershkovich
quelle
quelle
this
peter.michaux.ca/articles/javascript-widgets-without-thisthis
Schlüsselworts: rainsoft.io/gentle-explanation-of-this-in-javascriptAntworten:
Ich empfehle , zuerst den Artikel Scope von Mike West in JavaScript ( Spiegel ) zu lesen . Es ist eine hervorragende, freundliche Einführung in die Konzepte
this
und Umfangsketten von JavaScript.Sobald Sie sich daran gewöhnt haben,
this
sind die Regeln eigentlich ziemlich einfach. Der ECMAScript 5.1 Standard definiertthis
:Diese Bindung wird vom JavaScript-Interpreter beibehalten, wenn er JavaScript-Code auswertet, wie z. B. ein spezielles CPU-Register, das einen Verweis auf ein Objekt enthält. Der Interpreter aktualisiert die ThisBinding, wenn in einem von nur drei verschiedenen Fällen ein Ausführungskontext eingerichtet wird:
1. Anfänglicher globaler Ausführungskontext
Dies ist der Fall bei JavaScript-Code, der auf oberster Ebene ausgewertet wird, z. B. direkt in einem
<script>
:Bei der Auswertung von Code im anfänglichen globalen Ausführungskontext wird ThisBinding auf das globale Objekt festgelegt
window
( §10.4.1.1 ).Eval-Code eingeben
…
eval()
Wird durch einen direkten Aufruf von ThisBinding unverändert gelassen; Es ist der gleiche Wert wie ThisBinding des aufrufenden Ausführungskontexts ( §10.4.2 (2) (a)).… Wenn nicht durch einen direkten Aufruf von
eval()
ThisBinding, wird das globale Objekt so eingestellt, als würde es im anfänglichen globalen Ausführungskontext ausgeführt ( §10.4.2 (1)).
§15.1.2.1.1 definiert, was ein direkter Anruf
eval()
ist. Grundsätzlicheval(...)
handelt es sich um einen direkten Anruf, während etwas wie(0, eval)(...)
odervar indirectEval = eval; indirectEval(...);
ein indirekter Anruf isteval()
. Siehe Chuckjs Antwort auf (1, eval) ('this') vs eval ('this') in JavaScript? und Dmitry Soshnikovs ECMA-262-5 im Detail. Kapitel 2. Strenger Modus. für den Fall, dass Sie einen indirekteneval()
Anruf verwenden könnten .Funktionscode eingeben
Dies tritt beim Aufrufen einer Funktion auf. Wenn eine Funktion für ein Objekt aufgerufen wird, z. B. in
obj.myMethod()
oder ein gleichwertiges Objekt, wirdobj["myMethod"]()
ThisBinding auf das Objekt gesetzt (obj
im Beispiel; §13.2.1 ). In den meisten anderen Fällen wird ThisBinding auf das globale Objekt festgelegt ( §10.4.3 ).Der Grund für das Schreiben "in den meisten anderen Fällen" liegt darin, dass acht integrierte ECMAScript 5-Funktionen vorhanden sind, mit denen ThisBinding in der Argumentliste angegeben werden kann. Diese Sonderfunktionen haben eine sogenannte Funktion,
thisArg
die beim Aufruf der Funktion zur ThisBinding wird ( §10.4.3 ).Diese speziellen integrierten Funktionen sind:
Function.prototype.apply( thisArg, argArray )
Function.prototype.call( thisArg [ , arg1 [ , arg2, ... ] ] )
Function.prototype.bind( thisArg [ , arg1 [ , arg2, ... ] ] )
Array.prototype.every( callbackfn [ , thisArg ] )
Array.prototype.some( callbackfn [ , thisArg ] )
Array.prototype.forEach( callbackfn [ , thisArg ] )
Array.prototype.map( callbackfn [ , thisArg ] )
Array.prototype.filter( callbackfn [ , thisArg ] )
Bei den
Function.prototype
Funktionen werden sie für ein Funktionsobjekt aufgerufen, aber anstatt ThisBinding auf das Funktionsobjekt zu setzen, wird ThisBinding auf das gesetztthisArg
.Bei den
Array.prototype
Funktionen wird dascallbackfn
Angegebene in einem Ausführungskontext aufgerufen, in dem ThisBinding auf gesetzt ist,thisArg
falls angegeben. Andernfalls zum globalen Objekt.Dies sind die Regeln für einfaches JavaScript. Wenn Sie anfangen, JavaScript-Bibliotheken (z. B. jQuery) zu verwenden, stellen Sie möglicherweise fest, dass bestimmte Bibliotheksfunktionen den Wert von manipulieren
this
. Die Entwickler dieser JavaScript-Bibliotheken tun dies, weil sie in der Regel die häufigsten Anwendungsfälle unterstützen und Benutzer der Bibliothek dieses Verhalten normalerweise als bequemer empfinden. Wenn Sie Rückruffunktionen übergeben, diethis
auf Bibliotheksfunktionen verweisen, sollten Sie in der Dokumentation nach Garantien suchen, welchen Wert der Wert beimthis
Aufrufen der Funktion hat.Wenn Sie sich fragen, wie eine JavaScript-Bibliothek den Wert von manipuliert
this
, verwendet die Bibliothek einfach eine der integrierten JavaScript-Funktionen, die a akzeptierenthisArg
. Sie können auch Ihre eigene Funktion mit einer Rückruffunktion schreiben undthisArg
:Es gibt einen Sonderfall, den ich noch nicht erwähnt habe. Beim Erstellen eines neuen Objekts über den
new
Operator erstellt der JavaScript-Interpreter ein neues, leeres Objekt, legt einige interne Eigenschaften fest und ruft dann die Konstruktorfunktion für das neue Objekt auf. Wenn also eine Funktion in einem Konstruktorkontext aufgerufen wird, ist der Wert vonthis
das neue Objekt, das der Interpreter erstellt hat:Pfeilfunktionen
Pfeil Funktionen (eingeführt in ECMA6) verändern den Umfang
this
. Siehe die vorhandene kanonische Frage, Pfeilfunktion vs. Funktionsdeklaration / Ausdrücke: Sind sie äquivalent / austauschbar? für mehr Informationen. Aber kurz gesagt:Testen Sie Ihr Verständnis nur zum Spaß anhand einiger Beispiele
Bewegen Sie den Mauszeiger über die hellgrauen Kästchen, um die Antworten anzuzeigen.
Was ist der Wert
this
an der markierten Linie? Warum?Was ist der Wert
this
an der markierten Zeile, wennobj.staticFunction()
ausgeführt wird? Warum?Was ist der Wert
this
an der markierten Linie? Warum?Was ist der Wert
this
an der markierten Linie? Warum?Was ist der Wert
this
an der markierten Linie? Warum?quelle
setTimeout
Beispiel einthis
von hatwindow(global)
.Das
this
Schlüsselwort verhält sich in JavaScript anders als in anderen Sprachen. In objektorientierten Sprachenthis
bezieht sich das Schlüsselwort auf die aktuelle Instanz der Klasse. In JavaScript wird der Wert vonthis
durch den Aufrufkontext der Funktion bestimmt (context.function()
) bestimmt und wo er aufgerufen wird.1. Bei Verwendung im globalen Kontext
Wenn Sie
this
im globalen Kontext verwenden, ist es an ein globales Objekt gebunden (window
im Browser).Wenn Sie
this
innerhalb einer im globalen Kontext definierten Funktion verwenden,this
ist diese weiterhin an ein globales Objekt gebunden, da die Funktion tatsächlich zu einer Methode des globalen Kontexts gemacht wird.Oben
f1
ist eine Methode des globalen Objekts gemacht. Daher können wir es aufwindow
Objekt auch wie folgt aufrufen :2. Bei Verwendung innerhalb der Objektmethode
Wenn Sie ein
this
Schlüsselwort in einer Objektmethode verwenden,this
wird es an das "unmittelbare" umschließende Objekt gebunden.Oben habe ich das Wort sofort in doppelte Anführungszeichen gesetzt. Es ist darauf hinzuweisen, dass, wenn Sie das Objekt in einem anderen Objekt verschachteln,
this
es an das unmittelbare übergeordnete Objekt gebunden ist.Selbst wenn Sie dem Objekt eine Funktion explizit als Methode hinzufügen, folgt es den obigen Regeln, dh es zeigt
this
immer noch auf das unmittelbare übergeordnete Objekt.3. Beim Aufrufen der kontextlosen Funktion
Wenn Sie eine
this
Inside-Funktion verwenden, die ohne Kontext aufgerufen wird (dh nicht für ein Objekt), ist sie an das globale Objekt (window
im Browser) gebunden (auch wenn die Funktion innerhalb des Objekts definiert ist).Ich versuche alles mit Funktionen
Wir können die obigen Punkte auch mit Funktionen ausprobieren. Es gibt jedoch einige Unterschiede.
this
. um sie zu spezifizieren.new
Operator .Unten habe ich alle Dinge ausprobiert, die wir mit Object und
this
höher gemacht haben, aber indem ich zuerst eine Funktion erstellt habe, anstatt ein Objekt direkt zu schreiben.4. Bei Verwendung innerhalb der Konstruktorfunktion .
Wenn die Funktion als Konstruktor verwendet wird (dh wenn sie mit einem
new
Schlüsselwort aufgerufen wird ), zeigt derthis
Funktionskörper innerhalb des Funktionskörpers auf das neu erstellte Objekt.5. Bei Verwendung innerhalb der in der Prototypenkette definierten Funktion
Wenn sich die Methode in der Prototypenkette eines Objekts befindet,
this
bezieht sich diese Methode auf das Objekt, für das die Methode aufgerufen wurde, als ob die Methode für das Objekt definiert wäre.6. Wenden Sie in call () die Funktionen apply () und bind () an
Function.prototype
.this
verwendet wird, während die Funktion ausgeführt wird. Sie übernehmen auch alle Parameter, die beim Aufrufen an die ursprüngliche Funktion übergeben werden.fun.apply(obj1 [, argsArray])
Legtobj1
den Wert vonthis
inside festfun()
und ruftfun()
übergebende ElementeargsArray
als Argumente auf.fun.call(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])
- Setsobj1
als der Wert vonthis
innenfun()
und Anrufenfun()
vorbeiarg1, arg2, arg3, ...
als Argumente.fun.bind(obj1 [, arg1 [, arg2 [,arg3 [, ...]]]])
- Gibt den Verweis auf die Funktion zurück,fun
wobei derthis
innere Spaß anobj1
und die Parameterfun
an die angegebenen Parameter gebunden sindarg1, arg2, arg3,...
.apply
,call
undbind
müssen offensichtlich geworden sind.apply
Ermöglicht die Angabe der Argumente, die als Array-ähnliches Objekt fungieren sollen, dh ein Objekt mit einer numerischenlength
Eigenschaft und entsprechenden nicht negativen ganzzahligen Eigenschaften. Währendcall
ermöglicht direkt die Argumente der Funktion zu spezifizieren. Beideapply
undcall
rufen sofort die Funktion im angegebenen Kontext und mit den angegebenen Argumenten auf. Gibt andererseitsbind
einfach die an den angegebenenthis
Wert und die Argumente gebundene Funktion zurück . Wir können den Verweis auf diese zurückgegebene Funktion erfassen, indem wir ihn einer Variablen zuweisen, und später können wir ihn jederzeit aufrufen.7.
this
Inside Event Handlerthis
bezieht sich die Verwendung der Funktion zur direkten Behandlung innerhalb des Ereignisses auf das entsprechende Element. Eine solche direkte Funktionszuweisung kann unter Verwendung eineraddeventListener
Methode oder durch herkömmliche Ereignisregistrierungsmethoden wie erfolgenonclick
.this
direkt innerhalb der Ereigniseigenschaft (wie<button onclick="...this..." >
) des Elements verwenden, bezieht sich dies auf das Element.this
indirekt über die andere Funktion, die innerhalb der Ereignisbehandlungsfunktion oder der Ereigniseigenschaft aufgerufen wird, wird jedoch in das globale Objekt aufgelöstwindow
.attachEvent
. Anstatt die Funktion dem Ereignishandler zuzuweisen (und damit die Funktionsmethode des Elements zu erstellen), ruft sie die Funktion für das Ereignis auf (ruft sie effektiv im globalen Kontext auf).Ich empfehle, dies besser in JSFiddle zu versuchen .
8.
this
in der ES6-PfeilfunktionIn einer Pfeilfunktion
this
verhält es sich wie allgemeine Variablen: Es wird von seinem lexikalischen Bereich geerbt. Die Funktionthis
, in der die Pfeilfunktion definiert ist, ist die Pfeilfunktionthis
.Das ist also das gleiche Verhalten wie:
Siehe folgenden Code:
quelle
this
nicht durch den Aufruf festgelegt. Da sich der Code nicht im strengen Modus befindet, muss der Wert vonthis
immer ein Objekt sein, sodass standardmäßig das globale Objekt verwendet wird. Und in der Tat dachte ich deshalb, wir könnten direkt anrufenwindow.f1()
, so dass das Mittelf1()
bereits an daswindow
Objekt gebunden ist, meine ich vor dem Aufruf. Verstehe ich es falsch?window.fn
, was es nicht ist. Dies ist standardmäßig das globale Objekt, da im Aufruf keine Basisreferenz verwendet wurde, nicht aufgrund der Definition der Funktion ( dies wird also immer noch durch den Aufruf der Funktion festgelegt ). Wenn Sie es explizit mit aufrufenwindow.fn
, setzen Sie dies auf window . Gleiches Ergebnis, andere Vorgehensweise. :-)Javascript
this
Einfacher Funktionsaufruf
Betrachten Sie die folgende Funktion:
Beachten Sie, dass wir dies im normalen Modus ausführen, dh der strikte Modus wird nicht verwendet.
Wenn Sie in einem Browser ausgeführt werden, wird der Wert von
this
als protokolliertwindow
. Das ist weilwindow
es sich um die globale Variable im Bereich eines Webbrowsers handelt.Wenn Sie denselben Code in einer Umgebung wie node.js ausführen,
this
auf die globale Variable in Ihrer App verwiesen.Wenn wir dies nun im strengen Modus ausführen, indem wir die Anweisung
"use strict";
am Anfang der Funktionsdeklaration hinzufügen ,this
wird in keiner der Umgebungen mehr auf die globale Variable verwiesen. Dies geschieht, um Verwirrungen im strengen Modus zu vermeiden.this
würde in diesem Fall einfach protokollierenundefined
, da dies nicht definiert ist.In den folgenden Fällen würden wir sehen, wie der Wert von manipuliert wird
this
.Aufruf einer Funktion für ein Objekt
Es gibt verschiedene Möglichkeiten, dies zu tun. Wenn Sie native Methoden in Javascript wie
forEach
und aufgerufen habenslice
, sollten Sie bereits wissen, dass sich diethis
Variable in diesem Fall auf die bezieht,Object
auf die Sie diese Funktion aufgerufen haben (Beachten Sie, dass in Javascript fast alles ein istObject
, einschließlichArray
s undFunction
s). Nehmen Sie zum Beispiel den folgenden Code.Wenn a
Object
eine Eigenschaft enthält, die a enthältFunction
, wird die Eigenschaft als Methode bezeichnet. Wenn diese Methode aufgerufen wird, wird ihrethis
Variable immer auf die Variable gesetzt, derObject
sie zugeordnet ist. Dies gilt sowohl für strenge als auch für nicht strenge Modi.Beachten Sie, dass der Verweis auf
this
in der neuen Variablen nicht mehr beibehalten wird , wenn eine Methode in einer anderen Variablen gespeichert (oder vielmehr kopiert) wird. Zum Beispiel:Betrachtet man ein allgemeineres praktisches Szenario:
Das
new
SchlüsselwortBetrachten Sie eine Konstruktorfunktion in Javascript:
Wie funktioniert das? Mal sehen, was passiert, wenn wir das
new
Schlüsselwort verwenden.new
Schlüsselwort würde sofort einenObject
Typ initialisierenPerson
.Object
ist der Konstruktor festgelegtPerson
. Beachten Sie auch, dasstypeof awal
zurückkehren würdeObject
nur.Object
würde der Prototyp von zugewiesenPerson.prototype
. Dies bedeutet, dass jede Methode oder Eigenschaft imPerson
Prototyp für alle Instanzen von verfügbar istPerson
, einschließlichawal
.Person
selbst wird jetzt aufgerufen.this
eine Referenz auf das neu konstruierte Objekt seinawal
.Ziemlich einfach, oder?
Beachten Sie, dass die offizielle ECMAScript-Spezifikation nirgends besagt, dass solche Arten von Funktionen tatsächliche
constructor
Funktionen sind. Sie sind nur normale Funktionen undnew
können für jede Funktion verwendet werden. Es ist nur so, dass wir sie als solche verwenden und sie daher nur als solche bezeichnen.Funktionen für Funktionen aufrufen:
call
undapply
Also ja, da
function
sind es auchObjects
(und tatsächlich erstklassige Variablen in Javascript) sind, haben sogar Funktionen Methoden, die ... nun, Funktionen selbst sind.Alle Funktionen erben vom Globalen
Function
, und zwei seiner vielen Methoden sindcall
undapply
, und beide können verwendet werden, um den Wert vonthis
in der Funktion zu manipulieren, für die sie aufgerufen werden.Dies ist ein typisches Beispiel für die Verwendung
call
. Es nimmt grundsätzlich den ersten Parameter und setztthis
in der Funktionfoo
als Referenz aufthisArg
. Alle anderen übergebenen Parametercall
werdenfoo
als Argumente an die Funktion übergeben .Der obige Code meldet sich also
{myObj: "is cool"}, [1, 2, 3]
in der Konsole an. Ziemlich schöne Möglichkeit, den Wert von zu ändernthis
einer Funktion .apply
ist fast dasselbe wie zucall
akzeptieren, dass nur zwei Parameter benötigt werden:thisArg
und ein Array, das die Argumente enthält, die an die Funktion übergeben werden sollen. Der obigecall
Aufruf kann also folgendermaßen übersetzt werdenapply
:Beachten Sie, dass
call
undapply
den Wert von überschreiben kannthis
Aufrufs der durch die Punktmethode festgelegten Menge wir im zweiten Aufzählungszeichen erörtert haben. Einfach genug :)Präsentieren ....
bind
!bind
ist ein Bruder voncall
undapply
. Es ist auch eine Methode, die von allen Funktionen des globalenFunction
Konstruktors in Javascript geerbt wird . Der Unterschied zwischenbind
undcall
/apply
besteht darin, dass beidecall
undapply
die Funktion tatsächlich aufrufen.bind
Gibt andererseits eine neue Funktion mit der VoreinstellungthisArg
und zurückarguments
. Nehmen wir ein Beispiel, um dies besser zu verstehen:Sehen Sie den Unterschied zwischen den drei? Es ist subtil, aber sie werden unterschiedlich verwendet. Wie
call
undapply
,bind
auch over-ride den Wertthis
Satz von Punkt-Methodenaufruf.Beachten Sie auch, dass keine dieser drei Funktionen Änderungen an der ursprünglichen Funktion vornimmt.
call
undapply
würde den Wert von frisch konstruierten Funktionen während zurückgebenbind
die frisch konstruierte Funktion selbst zurückgegeben wird, die zum Aufrufen bereit ist.Zusätzliches Zeug, kopiere das
Manchmal gefällt Ihnen die Tatsache nicht, dass sich
this
Änderungen mit dem Bereich ändern, insbesondere der verschachtelte Bereich. Schauen Sie sich das folgende Beispiel an.Im obigen Code sehen wir, dass sich der Wert von
this
mit dem verschachtelten Bereich geändert hat, aber wir wollten den Wert vonthis
vom ursprünglichen Bereich. Also wir ‚kopiert‘this
aufthat
und verwendet kopieren die stattthis
. Clever, was?Index:
this
standardmäßig enthalten?new
Schlüsselwort verwenden?this
mitcall
undapply
?bind
.this
um Probleme mit verschachtelten Bereichen zu lösen.quelle
"das" dreht sich alles um Umfang. Jede Funktion hat ihren eigenen Bereich, und da alles in JS ein Objekt ist, kann sogar eine Funktion mit "this" einige Werte in sich speichern. OOP 101 lehrt, dass "dies" nur für Instanzen gilt eines Objekts gilt. Daher hat jedes Mal, wenn eine Funktion ausgeführt wird, eine neue "Instanz" dieser Funktion eine neue Bedeutung von "dies".
Die meisten Menschen sind verwirrt, wenn sie versuchen, "dies" in anonymen Schließfunktionen wie:
Hier in jedem () enthält "this" also nicht den "Wert", den Sie erwarten (von
über). Um dieses Problem zu lösen (kein Wortspiel beabsichtigt), könnte ein Entwickler:Versuch es; Sie werden anfangen, dieses Programmiermuster zu mögen
quelle
this
Schlüsselwort hat nichts mit dem Gültigkeitsbereich zu tun. Es hat auch eine Bedeutung auch in Funktionen, die keine Eigenschaften von Objekten sind.this
geht es nicht nur um Umfang. Es geht ALLES um den Ausführungskontext, der nicht mit dem Bereich identisch ist. JavaScript hat einen lexikalischen Gültigkeitsbereich (dh der Gültigkeitsbereich wird durch die Position des Codes bestimmt), wird jedoch davonthis
bestimmt, wie die Funktion, die ihn enthält, aufgerufen wird - nicht davon, wo sich diese Funktion befindet.Da dieser Thread aufgetaucht ist, habe ich einige Punkte für Leser zusammengestellt, die neu im
this
Thema sind.Wie wird der Wert von
this
bestimmt?Wir verwenden dies ähnlich wie wir Pronomen in natürlichen Sprachen wie Englisch verwenden: „John rennt schnell, weil er versucht, den Zug zu erreichen.“ Stattdessen hätten wir schreiben können: „… John versucht, den Zug zu erreichen“.
this
wird erst dann ein Wert zugewiesen, wenn ein Objekt die Funktion aufruft, in der es definiert ist. Im globalen Bereich werden alle globalen Variablen und Funktionen für daswindow
Objekt definiert . Daherthis
bezieht sich eine globale Funktion auf das globalewindow
Objekt (und hat dessen Wert) .Wenn
use strict
,this
die gebunden sind , nicht auf jedes Objekt in der globalen und in anonymen Funktionen enthält einen Wert vonundefined
.Das
this
Schlüsselwort wird am häufigsten missverstanden, wenn: 1) wir eine verwendete Methode ausleihenthis
, 2)this
einer Variablen eine verwendete Methode zuweisen , 3) eine verwendete Funktionthis
als Rückruffunktion übergeben wird und 4)this
innerhalb eines Abschlusses verwendet wird - eine innere Funktion. (2)Was hält die Zukunft
In ECMA Script 6 definiert , übernehmen Pfeilfunktionen die
this
Bindung aus dem umschließenden (funktionalen oder globalen) Bereich.Während Pfeilfunktionen eine Alternative zur Verwendung darstellen
bind()
, ist es wichtig zu beachten, dass sie im Wesentlichen den traditionellenthis
Mechanismus zugunsten eines allgemeineren lexikalischen Geltungsbereichs deaktivieren . (1)Verweise:
quelle
this
bezieht sich in JavaScript immer auf den 'Eigentümer' der Funktion, die ausgeführt wird .Wenn kein expliziter Eigentümer definiert ist, wird auf den obersten Eigentümer, das Fensterobjekt, verwiesen.
Also wenn ich es täte
element.onclick = someKindOfFunction;
this
würde sich auf das Elementobjekt beziehen. Aber seien Sie vorsichtig, viele Leute machen diesen Fehler.<element onclick="someKindOfFunction()">
Im letzteren Fall verweisen Sie lediglich auf die Funktion und übergeben sie nicht an das Element. Daher
this
wird auf das Fensterobjekt verwiesen.quelle
Jeder Ausführungskontext in Javascript hat einen diesen Parameter, der durch festgelegt ist:
eval
Sie können den Wert festgelegt dies mit
func.call
,func.apply
oderfunc.bind
.Standardmäßig und was die meisten Anfänger verwirrt, wenn ein Listener aufgerufen wird, nachdem ein Ereignis für ein DOM-Element ausgelöst wurde, ist dies Wert der Funktion das DOM-Element.
Mit jQuery ist es trivial, dies mit jQuery.proxy zu ändern.
quelle
this
in Javascript verwirrend ist, ist, dass es keine intrinsische Eigenschaft der Funktion selbst ist, sondern ein Artefakt der Art und Weise, wie die Funktion aufgerufen wird.func.call
,func.bind
usw. - Sushilthis
verweist nicht auf den Funktionsumfang einer Funktion.this
verweist auf ein bestimmtes Objekt (oder möglicherweiseundefined
), das, wie Sie gesagt haben, mit.call()
oder geändert werden kann.apply()
. Der Gültigkeitsbereich einer Funktion ist (im Wesentlichen vereinfacht), auf welche Variablen sie Zugriff hat. Dies hängt ganz davon ab, wo die Funktion deklariert ist und nicht geändert werden kann.this
und Umfang haben in ES5 und früher überhaupt nichts miteinander zu tun (z. B. als diese Antwort geschrieben wurde). In ES2015 (auch bekannt als ES6)this
und Bereich sind eine relativ minimale Beziehung zwischen Pfeilfunktionen (die Funktionthis
in einem Pfeil wird von ihrem umschließenden Bereich übernommen),this
bezieht sich jedoch niemals auf einen Bereich.Hier ist eine gute Quelle von
this
inJavaScript
.Hier ist die Zusammenfassung:
global dies
In einem Browser ist im globalen Bereich
this
daswindow
ObjektBei der
node
Verwendung von replthis
ist dies der oberste Namespace. Sie können es als bezeichnenglobal
.Bei der
node
Ausführung von einem Skript austhis
beginnt der globale Bereich als leeres Objekt. Es ist nicht dasselbe wieglobal
Funktion dies
Außer im Fall von DOM-Ereignishandlern oder wenn a
thisArg
bereitgestellt wird (siehe weiter unten), verwenden sowohl im Knoten als auch in einem Browserthis
in einer Funktion, die nicht mitnew
Verweisen aufgerufen wird, den globalen Bereich…Wenn Sie verwenden
use strict;
, wird in diesem Fallthis
seinundefined
Wenn Sie eine Funktion aufrufen, bei
new
derthis
es sich um einen neuen Kontext handelt, verweist sie nicht auf den globalen Kontextthis
.Von Ihnen erstellte Funktionen werden zu Funktionsobjekten. Sie erhalten automatisch eine spezielle
prototype
Eigenschaft, der Sie Werte zuweisen können. Wenn Sie eine Instanz erstellen, indem Sie Ihre Funktion mit aufrufen, erhaltennew
Sie Zugriff auf die Werte, die Sie derprototype
Eigenschaft zugewiesen haben . Sie greifen mit auf diese Werte zuthis
.Es ist normalerweise ein Fehler, Arrays oder Objekte auf dem zuzuweisen
prototype
. Wenn Sie möchten, dass Instanzen jeweils ihre eigenen Arrays haben, erstellen Sie sie in der Funktion und nicht im Prototyp.Sie können
this
in jeder Funktion eines Objekts auf andere Eigenschaften dieses Objekts verweisen. Dies ist nicht dasselbe wie eine Instanz, die mit erstellt wurdenew
.In einem HTML-DOM-Ereignishandler
this
wird immer auf das DOM-Element verwiesen, an das das Ereignis angehängt wurdeEs sei denn, Sie
bind
den KontextIn HTML-Attributen, in die Sie JavaScript einfügen können,
this
befindet sich ein Verweis auf das Element.Sie können verwenden,
eval
um darauf zuzugreifenthis
.Sie können den aktuellen Bereich zum Lesen und Schreiben von Werten
with
hinzufügenthis
,this
ohnethis
explizit darauf zu verweisen .Die jQuery wird an vielen Stellen
this
auf ein DOM-Element verweisen.quelle
Daniel, tolle Erklärung! Ein paar Worte dazu und eine gute Liste von
this
Ausführungskontextzeigern für Event-Handler.Mit zwei Worten,
this
in JavaScript zeigt das Objekt, von dem (oder von dessen Ausführungskontext) die aktuelle Funktion ausgeführt wurde, und es ist immer schreibgeschützt. Sie können es trotzdem nicht festlegen (ein solcher Versuch führt zu 'Ungültige linke Hand') Seite in Zuweisung 'Nachricht.Für Ereignishandler: Inline-Ereignishandler, z. B.
<element onclick="foo">
überschreiben Sie alle anderen Handler, die zuvor und zuvor angehängt wurden. Seien Sie also vorsichtig und vermeiden Sie die Inline-Ereignisdelegierung. Und danke an Zara Alaverdyan, die mich durch eine abweichende Debatte zu dieser Liste von Beispielen inspiriert hat :)el.onclick = foo; // in the foo - obj
el.onclick = function () {this.style.color = '#fff';} // obj
el.onclick = function() {doSomething();} // In the doSomething - Window
el.addEventListener('click',foo,false) // in the foo - obj
el.attachEvent('onclick, function () { // this }') // window, all the compliance to IE :)
<button onclick="this.style.color = '#fff';"> // obj
<button onclick="foo"> // In the foo - window, but you can <button onclick="foo(this)">
quelle
Es gibt viel Verwirrung darüber, wie "dies" Schlüsselwort in JavaScript interpretiert wird. Hoffentlich legt dieser Artikel alle ein für alle Mal zur Ruhe. Und vieles mehr. Bitte lesen Sie den gesamten Artikel sorgfältig durch. Seien Sie gewarnt, dass dieser Artikel lang ist.
Unabhängig vom Kontext, in dem es verwendet wird, verweist "this" immer auf das "aktuelle Objekt" in Javascript. Was das "aktuelle Objekt" ist, unterscheidet sich jedoch je nach Kontext . Der Kontext kann genau 1 der 6 folgenden sein:
Im Folgenden wird jeder dieser Kontexte einzeln beschrieben:
Globaler Kontext (dh außerhalb aller Funktionen):
Außerhalb aller Funktionen (dh im globalen Kontext) ist das "aktuelle Objekt" (und damit der Wert von "this" ) immer das "Fenster" -Objekt für Browser.
Inside Direct-Aufruf "Non Bound Function" :
Innerhalb eines direkten Aufrufs "Nicht gebundene Funktion" wird das Objekt, das den Funktionsaufruf aufgerufen hat, zum "aktuellen Objekt" (und damit zum Wert von "this" ). Wenn eine Funktion ohne explizites aktuelles Objekt aufgerufen wird , ist das aktuelle Objekt entweder das "Fenster" -Objekt (für den nicht strengen Modus) oder undefiniert (für den strengen Modus). Jede im globalen Kontext definierte Funktion (oder Variable) wird automatisch zu einer Eigenschaft des "Fenster" -Objekts. Zum Beispiel wird angenommen, dass die Funktion im globalen Kontext als definiert ist
Es wird zur Eigenschaft des Fensterobjekts, als hätten Sie es als definiert
Wenn Sie diese Funktion im "nicht strengen Modus" direkt über "UserDefinedFunction ()" aufrufen / aufrufen, wird sie automatisch als "window.UserDefinedFunction ()" aufgerufen / aufgerufen und "window" zum "aktuellen Objekt" (und damit zum Wert von "). this " ) in " UserDefinedFunction ". Wenn Sie diese Funktion im" Non Strict Mode "aufrufen, wird Folgendes ausgeführt
Wenn Sie im "Strict Mode" die Funktion direkt über "UserDefinedFunction ()" aufrufen / aufrufen, wird sie "NOT" automatisch als "window.UserDefinedFunction ()" aufrufen / aufrufen. Daher das "aktuelle Objekt" (und der Wert von "this"). ) innerhalb von "UserDefinedFunction" muss undefiniert sein . Das Aufrufen dieser Funktion im "Strict Mode" führt zu Folgendem
Das explizite Aufrufen mit dem Fensterobjekt führt jedoch zu Folgendem
Schauen wir uns ein anderes Beispiel an. Bitte schauen Sie sich den folgenden Code an
Im obigen Beispiel sehen wir, dass, wenn "UserDefinedFunction" über o1 aufgerufen wurde , "this" den Wert o1 annimmt und der Wert seiner Eigenschaften "a" und "b" angezeigt wird. Der Wert von "c" und "d" wurde als undefiniert angezeigt, da o1 diese Eigenschaften nicht definiert
Ähnlich , wenn „UserDefinedFunction“ wurde durch aufgerufen o2 , „this“ Wert nimmt o2 und den Wert seiner Eigenschaften „c“ und „d“ displayed.The Wert erhalten „a“ und „b“ wurden , wie gezeigt nicht definiert , wie o2 tut diese Eigenschaften nicht definieren.
Inside Indirect "Non Bound Function" Aufruf über functionName.call und functionName.apply :
Wenn eine "nicht gebundene Funktion" über functionName.call oder functionName.apply aufgerufen wird , wird das "aktuelle Objekt" (und damit der Wert von "this" ) auf den Wert des Parameters "this" (erster Parameter) gesetzt, der an den Aufruf übergeben wird Ich bewerbe mich . Der folgende Code zeigt dasselbe.
Der obige Code zeigt deutlich, dass der Wert "this" für jede "NON Bound Function" durch Aufruf / Anwenden geändert werden kann . Wenn der Parameter "this" nicht explizit an call / apply übergeben wird , wird "current object" (und damit der Wert von "this") im nicht strengen Modus auf "window" und im strengen Modus auf "undefined" gesetzt .
Innerhalb des Aufrufs "Gebundene Funktion" (dh einer Funktion, die durch Aufrufen von functionName.bind gebunden wurde ):
Eine gebundene Funktion ist eine Funktion, deren "dieser" Wert festgelegt wurde. Der folgende Code demonstrierte, wie "dies" bei gebundener Funktion funktioniert
Wie im obigen Code angegeben, kann "dieser" Wert für eine "gebundene Funktion" NICHT durch Aufrufen / Anwenden geändert werden . Wenn der Parameter "this" nicht explizit an bind übergeben wird, wird "current object" (und damit der Wert von "this" ) im nicht strengen Modus auf "window" und im strengen Modus auf "undefined" gesetzt . Eine Sache noch. Das Binden einer bereits gebundenen Funktion ändert den Wert von "this" nicht . Es bleibt als der von der ersten Bindungsfunktion festgelegte Wert festgelegt.
Während der Objekterstellung durch "neu" :
Innerhalb einer Konstruktorfunktion verweist das "aktuelle Objekt" (und damit der Wert von "this" ) auf das Objekt, das derzeit durch "new" erstellt wird, unabhängig vom Bindungsstatus der Funktion. Wenn der Konstruktor jedoch eine gebundene Funktion ist, wird er mit vordefinierten Argumenten aufgerufen, die für die gebundene Funktion festgelegt sind.
Inside Inline DOM-Ereignishandler :
Bitte schauen Sie sich das folgende HTML-Snippet an
Das "das" in den obigen Beispielen bezieht sich auf das "button" -Element bzw. das "div" -Element.
Im ersten Beispiel muss die Schriftfarbe der Schaltfläche beim Klicken auf Weiß gesetzt werden.
Im zweiten Beispiel wird beim Klicken auf das Element "div" die Funktion OnDivClick aufgerufen , wobei der zweite Parameter auf das angeklickte Element div verweist. Der Wert von "this" in OnDivClick darf jedoch NICHT auf das angeklickte div- Element verweisen . Es muss als "Fensterobjekt" oder "undefiniert" im nicht strengen bzw. strengen Modus festgelegt werden (wenn OnDivClick eine ungebundene Funktion ist ) oder auf einen vordefinierten gebundenen Wert festgelegt werden (wenn OnDivClick eine gebundene Funktion ist ).
Das Folgende fasst den gesamten Artikel zusammen
Im globalen Kontext bezieht sich "dies" immer auf das "Fenster" -Objekt
Wenn eine Funktion aufgerufen wird, wird sie im Kontext eines Objekts ( "aktuelles Objekt" ) aufgerufen . Wenn das aktuelle Objekt nicht explizit angegeben wird, ist das aktuelle Objekt standardmäßig das "Fensterobjekt" im NICHT-Strict-Modus und "Undefiniert" im Strict-Modus.
Der Wert von "this" innerhalb einer nicht gebundenen Funktion ist die Referenz auf ein Objekt, in dessen Kontext die Funktion aufgerufen wird ( "aktuelles Objekt" ).
Der Wert von "this" innerhalb einer nicht gebundenen Funktion kann durch Aufrufen und Anwenden von Methoden der Funktion überschrieben werden .
Der Wert von "this" ist für eine gebundene Funktion festgelegt und kann nicht durch Aufrufen und Anwenden von Methoden der Funktion überschrieben werden .
Die bindende und bereits gebundene Funktion ändert den Wert von "this" nicht. Es bleibt als der von der ersten Bindungsfunktion festgelegte Wert festgelegt.
Der Wert von "this" innerhalb eines Konstruktors ist das Objekt, das erstellt und initialisiert wird
Der Wert "this" in einem Inline-DOM-Ereignishandler bezieht sich auf das Element, für das der Ereignishandler angegeben ist.
quelle
Wahrscheinlich der ausführlichste und umfassendste Artikel über
this
ist der folgende:Schonende Erklärung dieses Schlüsselworts in JavaScript
Die Idee dahinter
this
ist zu verstehen, dass die Funktionsaufruftypen die signifikante Bedeutung für die Einstellung desthis
Werts haben.Wenn mit Schwierigkeiten zu identifizieren
this
, nicht sich fragen:aber Sie fragen Sie sich:
Für eine Pfeilfunktion (Sonderfall der Kontexttransparenz) fragen Sie sich:
Diese Einstellung ist richtig im Umgang mit
this
und erspart Ihnen Kopfschmerzen.quelle
this
Keyword zu verstehen .Dies ist die beste Erklärung , die ich gesehen habe: Verstehen Sie JavaScripts diese mit Clarity
Es gibt vier Szenarien, in denen dies verwirrend sein kann:
Er gibt Codebeispiele, Erklärungen und Lösungen, die ich für sehr hilfreich hielt.
quelle
In pseudoklassischen Begriffen ist die Art und Weise, wie viele Vorlesungen das Schlüsselwort 'this' lehren, ein Objekt, das von einer Klasse oder einem Objektkonstruktor instanziiert wird. Stellen Sie sich jedes Mal vor, wenn ein neues Objekt aus einer Klasse erstellt wird, dass unter der Haube eine lokale Instanz eines 'this'-Objekts erstellt und zurückgegeben wird. Ich erinnere mich, dass es so gelehrt wurde:
quelle
this
ist eines der missverstandenen Konzepte in JavaScript, da es sich von Ort zu Ort kaum anders verhält.this
Bezieht sich einfach auf den "Eigentümer" der Funktion, die wir gerade ausführen .this
hilft dabei, das aktuelle Objekt (auch als Ausführungskontext bezeichnet) abzurufen, mit dem wir arbeiten. Wenn Sie verstehen, in welchem Objekt die aktuelle Funktion ausgeführt wird, können Sie leicht verstehen, was aktuellthis
istOben erstellen wir 3 Variablen mit dem gleichen Namen 'val'. Eine im globalen Kontext, eine innerhalb von obj und die andere innerhalb von innerMethod of obj. JavaScript löst Bezeichner in einem bestimmten Kontext auf, indem die Bereichskette von local go global nach oben verschoben wird.
Nur wenige Orte, an denen
this
unterschieden werden kannAufrufen einer Methode eines Objekts
Wenn line1 ausgeführt wird, erstellt JavaScript einen Ausführungskontext (EC) für den Funktionsaufruf und setzt
this
auf das Objekt , auf das vor dem letzten "" verwiesen wird. . In der letzten Zeile können Sie also verstehen, dass diesa()
im globalen Kontext ausgeführt wurdewindow
.Mit Konstruktor
this
kann verwendet werden, um auf das zu erstellende Objekt zu verweisenWenn neu
Person()
ausgeführt wird, wird ein vollständig neues Objekt erstellt.Person
heißt und seinthis
auf dieses neue Objekt verweisen.Funktionsaufruf
Wenn das
new
SchlüsselwortwhatIsThis
fehlt, wird auf den globalsten Kontext verwiesen, den es finden kann (window
)Mit Event-Handlern
Wenn der Ereignishandler inline ist,
this
bezieht er sich auf ein globales Objektthis
Bezieht sich beim Hinzufügen eines Ereignishandlers über JavaScript auf das DOM-Element, das das Ereignis generiert hat..apply()
.call()
und bearbeiten.bind()
var that = this
bedeutet das in JavaScript ?quelle
Der Wert von "this" hängt vom "Kontext" ab, in dem die Funktion ausgeführt wird. Der Kontext kann ein beliebiges Objekt oder das globale Objekt sein, dh ein Fenster.
Die Semantik von "dies" unterscheidet sich also von den traditionellen OOP-Sprachen. Und es verursacht Probleme: 1. wenn eine Funktion an eine andere Variable übergeben wird (höchstwahrscheinlich ein Rückruf); und 2. wenn ein Abschluss von einer Mitgliedsmethode einer Klasse aufgerufen wird.
In beiden Fällen ist dies auf Fenster eingestellt.
quelle
Was würde das helfen? (Die größte Verwirrung von 'dies' in Javascript ist darauf zurückzuführen, dass es im Allgemeinen nicht mit Ihrem Objekt verknüpft ist, sondern mit dem aktuellen Ausführungsbereich - das funktioniert möglicherweise nicht genau so, fühlt sich für mich aber immer so an - eine vollständige Erklärung finden Sie im Artikel.)
quelle
Ein paar Infos dazu Keyword
Lassen Sie uns das
this
Schlüsselwort im globalen Bereich ohne weiteren Code in der Konsole protokollierenIn Client / Browser ist das
this
Schlüsselwort ein globales Objektwindow
und
In Server / Node / Javascript ist das Laufzeitschlüsselwort
this
auch ein globales Objektmodule.exports
Denken Sie daran,
exports
ist nur ein Hinweis aufmodule.exports
quelle
diese Verwendung für Scope einfach so
Der Wert von txt1 und txt ist im obigen Beispiel gleich. $ (this) = $ ('# tbleName tbody tr') ist der gleiche
quelle
Ich habe eine andere Einstellung
this
als die anderen Antworten, von denen ich hoffe, dass sie hilfreich sind.Eine Möglichkeit, JavaScript zu betrachten, besteht darin, festzustellen, dass es nur eine Möglichkeit gibt, eine Funktion 1 aufzurufen . Es ist
Es wird immer ein Wert angegeben
objectForThis
.Alles andere ist syntaktischer Zucker für
functionObject.call
Alles andere kann also dadurch beschrieben werden, wie es übersetzt wird
functionObject.call
.Wenn Sie nur eine Funktion aufrufen,
this
ist dies das "globale Objekt", das im Browser das Fenster istMit anderen Worten,
wurde effektiv übersetzt in
Beachten Sie, dass, wenn Sie den strengen Modus verwenden
this
, dies der Fall istundefined
was bedeutet
Mit anderen Worten,
wurde effektiv übersetzt in
In JavaScript gibt es Operatoren wie
+
und-
und*
. Es gibt auch den Punktoperator.
Der
.
Operator bedeutet bei Verwendung mit einer Funktion auf der rechten Seite und einem Objekt auf der linken Seite effektiv "Objekt übergeben als"this
Funktion übergeben".Beispiel
Mit anderen Worten
bar.foo()
übersetzt inconst temp = bar.foo; temp.call(bar);
Beachten Sie, dass es keine Rolle spielt, wie die Funktion erstellt wurde (meistens ...). All dies führt zu den gleichen Ergebnissen
Auch dies sind alles nur syntaktische Zucker für
Eine weitere Falte ist die Prototypkette. Wenn Sie
a.b
JavaScript verwenden, wird zuerst das Objekt überprüft, auf das direkta
für die Eigenschaft verwiesen wirdb
. Wennb
das Objekt nicht gefunden wird, sucht JavaScript im Prototyp des Objekts nachb
.Es gibt verschiedene Möglichkeiten, den Prototyp eines Objekts zu definieren. Am häufigsten wird 2019 das
class
Schlüsselwort verwendet. Für die Zwecke,this
obwohl es keine Rolle spielt. Was zählt, ist, dass, wenn es im Objekta
nach Eigenschaften sucht,b
wenn es Eigenschaftenb
auf dem Objekt findet, oder in seiner Prototypkette, wennb
es eine Funktion ist, dieselben Regeln wie oben gelten. Die Funktionsreferenzenb
werden mit dercall
Methode aufgerufen und übergebena
als objectForThis übergeben, wie oben in dieser Antwort gezeigt.Jetzt. Stellen wir uns vor, wir erstellen eine Funktion, die explizit festgelegt wird,
this
bevor eine andere Funktion aufgerufen wird, und rufen sie dann mit dem.
Operator (Punkt) aufIm Anschluss an die Übersetzung Gebrauch
call
,obj.bar()
wirdconst temp = obj.bar; temp.call(obj);
. Wenn wir diebar
Funktion eingeben, die wir aufrufen,foo
aber explizit ein anderes Objekt für objectForThis übergeben, wenn wir bei foo ankommenthis
ist dies das innere Objekt.Dies ist, was beide
bind
und=>
Funktionen effektiv tun. Sie sind mehr syntaktischer Zucker. Sie erstellen effektiv eine neue unsichtbare Funktion genau wiebar
oben, die explizit festgelegt wird,this
bevor die angegebene Funktion aufgerufen wird. Im Falle von bindthis
wird auf alles gesetzt, an das Sie übergebenbind
.Beachten Sie, dass
functionObject.bind
wir , wenn es nicht existiert, unsere eigenen so machen könntenund dann könnten wir es so nennen
Pfeilfunktionen, der
=>
Operator sind syntaktischer Zucker zum Bindenist das gleiche wie
Ebenso
bind
wird eine neue unsichtbare Funktion erstellt, die die angegebene Funktion mit einem gebundenen Wert aufruft, für denobjectForThis
jedoch im Gegensatz zubind
dem zu bindenden Objekt implizit ist. Es ist was auch immerthis
passiert, wenn die=>
Operator verwendet wird.Also, genau wie die obigen Regeln
obj.foo()
übersetztconst temp = obj.foo; temp.call(obj);
wodurch der Pfeil Operator innerhalbfoo
bindenobj
an eine neue unsichtbare Funktion und dass neue unsichtbare Funktion zurück , die zugewiesen istb
.b()
funktioniert wie immer alsb.call(window)
oderb.call(undefined)
ruft die neue unsichtbare Funktion auf, diefoo
erstellt wurde. Diese unsichtbare Funktion ignoriert dasthis
übergebene und wirdobj
als objectForThis` an die Pfeilfunktion übergeben.Der obige Code übersetzt in
1
apply
ist eine andere ähnliche Funktion wiecall
Ab ES6 können Sie dies jedoch konzeptionell sogar in übersetzen
quelle
Zusammenfassung
this
Javascript:this
wird dadurch bestimmt, wie die Funktion nicht aufgerufen wird, wo sie erstellt wurde!this
durch das Objekt bestimmt, das vom Punkt übrig bleibt. (window
im globalen Raum)this
bezieht sich auf das DOM-Element, für das das Ereignis aufgerufen wurde.new
Schlüsselwort der Wert von aufgerufen wirdthis
bezieht sich auf das neu erstellte Objektthis
mit den Funktionen:call
,apply
,bind
Beispiel:
Beispiel für Ereignis-Listener:
Beispielkonstruktor:
quelle
Um "dies" richtig zu verstehen, muss man den Kontext, den Umfang und den Unterschied zwischen ihnen verstehen.
Umfang : in JavaScript Umfang ist mit der Sichtbarkeit der Variablen bezogen, Umfang Erzielt durch die Verwendung der Funktion. (Lesen Sie mehr über den Umfang)
Kontext : Der Kontext bezieht sich auf Objekte. Es bezieht sich auf das Objekt, zu dem eine Funktion gehört. Wenn Sie das JavaScript-Schlüsselwort "this" verwenden, bezieht es sich auf das Objekt, zu dem die Funktion gehört. Wenn Sie beispielsweise innerhalb einer Funktion sagen: "this.accoutNumber", beziehen Sie sich auf die Eigenschaft "accoutNumber", die zu dem Objekt gehört, zu dem diese Funktion gehört.
Wenn das Objekt "myObj" eine Methode namens "getMyName" hat und das JavaScript-Schlüsselwort "this" in "getMyName" verwendet wird, verweist es auf "myObj". Wenn die Funktion "getMyName" im globalen Bereich ausgeführt wurde, bezieht sich "this" auf das Fensterobjekt (außer im strengen Modus).
Nun sehen wir uns ein Beispiel an:
Das Ausführen von Code in der Browserausgabe wird:
Entsprechend der Ausgabe, die Sie sich im Kontext des Fensterobjekts befinden, ist auch sichtbar, dass sich der Fensterprototyp auf das Objekt bezieht.
Versuchen wir es nun innerhalb einer Funktion:
Ausgabe:
Die Ausgabe ist dieselbe, da wir 'diese' Variable im globalen Bereich und im Funktionsbereich protokolliert haben. Wir haben den Kontext nicht geändert. In beiden Fällen war der Kontext in Bezug auf das Witwenobjekt derselbe .
Jetzt erstellen wir unser eigenes Objekt. In Javascript können Sie ein Objekt auf viele Arten erstellen.
Ausgabe:
Aus dem obigen Beispiel haben wir herausgefunden, dass sich das Schlüsselwort 'this' auf einen neuen Kontext bezieht, der mit myObj zusammenhängt, und myObject hat auch eine Prototypkette zu Object.
Lassen Sie uns ein weiteres Beispiel werfen:
Ausgabe: Sinn machen, oder? (Kommentare lesen)
Wenn Sie Probleme haben, das obige Beispiel zu verstehen, versuchen wir es mit unserem eigenen Rückruf.
Ausgabe:
Lassen Sie uns nun Scope, Self, IIFE und DIESES Verhalten verstehen
Die Ausgabe ist ziemlich großartig, oder?
quelle
Einfache Antwort:
Das Schlüsselwort "this" hängt immer vom Kontext des Aufrufs ab. Sie werden unten erwähnt.
Die Funktion wird mit einem neuen Schlüsselwort aufgerufen
Wenn die Funktion mit dem Schlüsselwort NEW aufgerufen wird, wird DIESES an das neu erstellte Objekt gebunden.
Oben wird dies an das Objekt 'myCar' gebunden
Die Funktion wird explizit unter Verwendung von Anruf- und Anwendungsmethoden aufgerufen.
In diesem Fall wird DIESES an das Objekt gebunden, das explizit an die Funktion übergeben wird.
Wenn die Funktion implizit mit dem Objekt aufgerufen wird, ist dies an dieses Objekt gebunden
Wenn die Funktion ohne Kontext aufgerufen wird, ist dies an ein globales Objekt gebunden
Im strengen Modus wird dies nicht definiert
quelle