Jeder kennt this
Javascript, aber es gibt auch Fälle, in self
denen man in freier Wildbahn vorkommt, wie hier
Was ist der Unterschied zwischen this
und self
in JavaScript?
javascript
Ben Nelson
quelle
quelle
window.self
(=== window
). Obwohl das OP wahrscheinlich einen trivialen Variablennamen bedeutet…this === self
wahr :-)this
aufself
ist heutzutage keine gute Praxis, wenn es als Folge der asynchronen Programmierung üblich ist, Code mit vielen (naja, mehr als eine ist schlecht genug) Ebenen der Rückrufverschachtelung zu haben. Verwenden Sie stattdessen einen aussagekräftigeren Namen. Objektiv gesehen enthält der Namethis
selbst keine Informationen und ist nur eine nicht schlechte Wahl des Namens, da der lexikalische Kontext einer Klassendefinition ihn qualifiziert.Antworten:
Es sei denn , an anderer Stelle gesetzt, der Wert
self
ist ,window
weil JavaScript Ermöglicht den Zugriff auf eine beliebige Eigenschaftx
vonwindow
als einfachx
, stattwindow.x
. Daherself
ist wirklichwindow.self
, was anders ist alsthis
.Wenn Sie eine Funktion verwenden, die im globalen Bereich ausgeführt wird und sich nicht im strengen Modus befindet, wird
this
standardmäßigwindow
und daher verwendetWenn Sie eine Funktion in einem anderen Kontext verwenden,
this
wird auf diesen Kontext verwiesen, dies wird jedochself
weiterhin der Fall seinwindow
.Eine
window.self
Definition im W3C 2006-Arbeitsentwurf für das Fensterobjekt finden Sie hier .quelle
self
halber ist dies im Kontext von WebWorker nützlich, wenn auf das Fenster nicht zugegriffen werden kann ( developer.mozilla.org/en-US/docs/Web/Guide/Performance/… ). Mitself
anstelle vonwindow
können Sie auf tragbare Weise auf das globale Objekt zugreifen.Eine geringfügige Ergänzung, da dies im Zusammenhang mit Servicemitarbeitern auftreten kann. In diesem Fall bedeutet dies etwas anderes.
Möglicherweise wird dies in einem Service Worker-Modul angezeigt:
Hier bezieht sich self auf das WorkerGlobalScope, und dies ist die Standardmethode zum Festlegen von Ereignis-Listenern.
Aus Mozilla-Dokumenten :
quelle
Ich bin zwar zu spät hier, aber ich bin auf ein Beispiel gestoßen, das ebenfalls hilfreich sein kann, um es besser zu verstehen
this
:O / P.
quelle
Der Verweis auf ECMA 5 muss präzisiert werden.
Ich gehe davon aus, dass dies ECMA-262 Edition 5 bedeutet. Es sollte beachtet werden, dass ECMA-262 (auch bekannt als ECMAScript oder weniger genau Javascript) eine allgemeine Skriptsprache ist, die in Internetbrowsern implementiert wurde. Ab dem Standard Edition 5.1:
Der Begriff "globales Objekt" bezieht sich auf jedes Objekt, das sich am Anfang der Bereichskette befindet. Für Browser wäre dies das "Fenster" -Objekt, dies ist jedoch eine Implementierungsoption (Windows Script Host hat ein unsichtbares globales Objekt, aber keinen strengen Modus, sodass unqualifizierte Referenzen auf seine Eigenschaften zugreifen und es kein globales "Selbst" gibt). Außerdem muss der "strikte Modus" explizit aktiviert werden, da er sonst nicht aktiv ist (Abschnitt 14.1 des Standards). Als solches würde ein undefiniertes "dies" immer noch in das globale Objekt (Fenster) in "ECMA 5" aufgelöst, wobei der strikte Modus nicht aktiv ist.
Die Antwort auf die Frage lautet also:
"this" bezieht sich immer auf das Objekt, das die Funktion aufruft. Wenn die Funktion nicht von einem Objekt aufgerufen wurde (dh kein Methodenaufruf), ist "this" (wie an die Funktion übergeben) "undefined". Wenn jedoch NICHT der strikte Modus verwendet wird, wird ein undefiniertes "dies" auf das globale Objekt gesetzt (Regel 2 oben).
"self" hat keine spezielle syntaktische Bedeutung, es ist nur eine Kennung. Browser neigen dazu, window.self (nur eine Eigenschaft des globalen Fensterobjekts) = window zu definieren. Dies führt dazu, dass uneingeschränkte Verweise auf "Selbst" dasselbe sind wie "Fenster", WENN "Selbst" in einem umschließenden Bereich neu definiert wurde (z. B. durch "var self = this;" oben. Viel Glück beim Neudefinieren von "this".)
Die vollständige Erklärung des obigen Beispiels lautet also:
Eine interessante Variation des Beispiels erzeugt einen Abschluss, indem ein Verweis auf die innere Funktion zurückgegeben wird.
Produzieren
Beachten Sie, dass die innere Funktion erst aufgerufen wird, wenn Sie von yourObject aufgerufen werden. Also ist this.foo jetzt yourObject.foo, aber self wird immer noch in die Variable im umschließenden Bereich aufgelöst, die zum Zeitpunkt der Rückgabe des inneren Funktionsobjekts myObject war (und in der resultierenden Schließung immer noch ist). Innerhalb der inneren Funktion bezieht sich "dies" auf das Objekt, das die innere Funktion aufruft, während sich "self" auf das Objekt bezieht, das die äußere Funktion aufgerufen hat, um den Verweis auf die innere Funktion zu erstellen.
Um die Zusammenfassung der Zusammenfassung zusammenzufassen, wird "dies" durch den Sprachstandard definiert, "selbst" wird durch denjenigen definiert, der sie definiert (Laufzeitimplementierer oder Endprogrammierer).
quelle
Nachfolgend finden Sie einige Kombinationen der Konsolenausgaben "Fenster", "Selbst" und "Diese" im globalen Bereich (Browserumgebung), um zu sehen, auf was sie sich beziehen.
quelle