Wie funktioniert keyword "this" innerhalb der Funktion?
Ich kam gerade über eine interessante situation, in JavaScript. Ich habe eine Klasse mit einer Methode, die definiert, mehrere Objekte mit dem Objekt-literal Schreibweise. Im inneren dieser Objekte, die this
Zeiger verwendet wird. Aus dem Verhalten des Programms, habe ich gefolgert, dass die this
Zeiger verweist auf die Klasse, auf dem die Methode aufgerufen wurde, und nicht das Objekt erzeugt wird, indem die wörtliche.
Dies scheint willkürlich, aber es ist die Art und Weise würde ich erwarten, dass es funktioniert. Ist das Verhalten definiert? Ist es cross-browser sicher? Gibt es irgendeine Begründung, warum es ist wie es ist, über "die spec sagt ja" (zum Beispiel, ist es eine Folge der etwas breiteren design-Entscheidung/Philosophie)? Abgespeckte code Beispiel:
//inside class definition, itself an object literal, we have this function:
onRender: function() {
this.menuItems = this.menuItems.concat([
{
text: 'Group by Module',
rptletdiv: this
},
{
text: 'Group by Status',
rptletdiv: this
}]);
//etc
}
var signup = { onLoadHandler:function(){ console.log(this); return Type.createDelegate(this,this._onLoad); }, _onLoad: function (s, a) { console.log("this",this); }};
siehe auch Wie geht der "this" - Schlüsselwort in Javascript agieren in einem Objekt-literal?
check out diesem post. Hat einige gute Erläuterung der verschiedenen Nutzungs-und Verhaltensweisen dieses keyword.
Kasse diesem link scotch.io/@alZami/understanding-this-in-javascript
InformationsquelleAutor rmeador | 2008-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausgeschlachtet aus einem anderen post von mir, hier ist mehr, als Sie jemals wissen wollten über diese.
Bevor ich beginne, hier ist die wichtigste Sache im Auge zu behalten um Javascript, und zu wiederholen, selbst wenn es keinen Sinn ergibt. Javascript muss nicht Klassen (ES6
class
ist syntaktischer Zucker). Wenn etwas aussieht wie eine Klasse, es ist ein trick. Javascript hat Objekte und Funktionen. (das ist nicht 100% korrekt, Funktionen Objekte sind, aber es kann manchmal hilfreich sein, zu denken, Sie als getrennte Dinge)Den diese variable angeschlossen ist, um Funktionen. Wann immer Sie eine Funktion aufzurufen diese gegeben einen bestimmten Wert, je nachdem, wie Sie zum aufrufen der Funktion. Dies wird Häufig als die Aufruf-Muster.
Gibt es vier Möglichkeiten zum aufrufen von Funktionen in javascript. Sie rufen die Funktion als Methode, als Funktion, als Konstruktor, und mit gelten.
Als Methode
Eine Methode ist eine Funktion, die einem Objekt zugewiesen
Beim Aufruf als Methode diese gebunden wird das Objekt durch die Funktion/Methode ein Teil ist. In diesem Beispiel wird an foo.
Als Funktion
Wenn Sie eine stand-alone-Funktion, die diese variable gebunden werden, um die "global" - Objekt, fast immer die Fenster Objekt im Zusammenhang mit einem browser.
Das kann was werden ' s stolpern, die Sie bis, aber fühlen Sie sich nicht schlecht. Viele Menschen halten dies für eine schlechte design-Entscheidung. Da wird ein callback aufgerufen wird, als Funktion und nicht als Methode, das ist, warum Sie sehen, was scheint widersprüchlich Verhalten.
Viele Menschen bekommen, um das problem von etwas wie, ähm, das
Definieren Sie eine variable , dass, die Punkte zu diese. Verschluss (ein Thema, alle eigenen) hält , dass herum, so, wenn Sie anrufen, eine bar, einen Rückruf, es hat immer noch eine Referenz.
HINWEIS: In
use strict
- Modus, wenn als Funktionthis
ist nicht verpflichtet, zu global. (Es istundefined
).Wie ein Konstruktor,
Können Sie auch aufrufen, eine Funktion als Konstruktor. Auf der Grundlage der Namenskonvention, die Sie verwenden (TestObject) diese auch kann das sein, was du tust und was stolpern, die Sie bis.
Rufen Sie eine Funktion als Konstruktor mit dem Schlüsselwort new.
Beim Aufruf als Konstruktor wird ein neues Objekt erstellt werden, und diese wird an das Objekt. Wieder, wenn Sie innere Funktionen und Sie sind als callbacks, werden Sie aufrufen, Sie als Funktionen, und diese wird an das Globale Objekt. Verwenden, var, = den trick/Muster.
Einige Leute denken, dass der Konstruktor/new-Schlüsselwort war ein Knochen geworfen, um Java/traditionelle OOP-Programmierern als ein Weg, um etwas ähnliches wie Klassen.
Mit der Apply-Methode
Schließlich verfügt jede Funktion über eine Methode (ja, auch Funktionen sind Objekte in Javascript) mit der Bezeichnung "übernehmen". Bewerben können Sie bestimmen, was der Wert von diese werden, und können Sie auch ein array übergeben von Argumenten. Hier ist ein nutzloses Beispiel.
Hinweis: In strict-Modus,
this
wirdundefined
für die Funktion Aufrufe.Eine Funktion Erklärung, wie zB. function meinefunktion () {}, ist ein spezieller Fall "als eine Methode," wo "dieser" ist der Globale Bereich (Fenster).
Außer im strict-Modus, und
this
hat nichts zu tun mit Umfang. Du meinst die globalen Objekt.Im Fall von "Wie ein Konstruktor" ist
this.confusing = 'hell yeah';
das gleiche wievar confusing = 'hell yeah';
? Also beide erlaubenmyObject.confusing
? Es wäre schön, wenn nicht nur, so dass Sie verwenden könnenthis
zu erstellen, die Eigenschaften und die anderen Variablen für die innere Arbeit.InformationsquelleAutor Alan Storm
Funktionsaufrufe
Funktionen sind nur eine Art von Objekt.
Funktion alle Objekte haben rufen und bewerben Methoden, die die Funktion execute-Objekt nennt man Sie auf.
Wenn Sie aufgerufen, das erste argument für diese Methoden gibt, das Objekt verwiesen wird, die von der
this
Schlüsselwort während der Ausführung der Funktion - wenn esnull
oderundefined
wird die Globale Objekt -,window
, ist fürthis
.Somit eine Funktion aufrufen...
...mit Klammern -
foo()
- entsprichtfoo.call(undefined)
oderfoo.apply(undefined)
, die effektiv das gleiche wiefoo.call(window)
oderfoo.apply(window)
.Zusätzlichen Argumente an, um
call
übergeben werden als Argumente an die Funktion aufrufen, in der Erwägung, dass ein einziges zusätzliches argument, umapply
können Sie die Argumente für den Funktionsaufruf als ein Array-ähnliches Objekt.So
foo(1, 2, 3)
entsprichtfoo.call(null, 1, 2, 3)
oderfoo.apply(null, [1, 2, 3])
.Wenn eine Funktion eine Eigenschaft eines Objekts...
...zugreifen auf eine Referenz auf die Funktion über das Objekt und nannte es mit Klammern -
obj.foo()
- entsprichtfoo.call(obj)
oderfoo.apply(obj)
.Jedoch Funktionen statt als Eigenschaften der Objekte sind nicht "gebunden", um diese Objekte. Wie Sie sehen können, in der definition von
obj
oben, da Funktionen nur einen Typ von Objekt, auf Sie verwiesen werden können (und somit können durch Verweis übergeben, um eine Funktion aufgerufen oder zurückgekehrt Verweis aus einem Funktionsaufruf). Wenn eine Referenz auf eine Funktion übergeben wird, werden keine zusätzlichen Informationen, in dem es übergeben wurde von getragen wird, die ist, warum Folgendes passiert:Den Aufruf unserer Funktion Referenz
baz
, aber kein Kontext für den Anruf, es ist also genauso effektiv wie diebaz.call(undefined)
, sothis
endet Referenzierungwindow
. Wenn wir wollen, dassbaz
zu wissen, dass es gehört zuobj
müssen wir irgendwie vorsehen, dass Informationen, wennbaz
genannt wird, ist die, wo das erste argumentcall
oderapply
und Verschlüsse ins Spiel kommen.Bereichsketten
Wenn eine Funktion ausgeführt wird, erstellt er einen neuen scope und hat einen Verweis auf die umschließenden scope. Wenn die anonyme Funktion erstellt wird, in obigem Beispiel, hat es einen Verweis auf den Geltungsbereich in der es erstellt wurde, die
bind
's scope. Dies ist bekannt als "Verschluss" ist.Wenn Sie versuchen, Zugriff auf eine variable dieses "scope chain" gegangen ist, zu finden, eine variable mit dem angegebenen Namen - wenn der aktuelle Rahmen nicht enthalten, die variable, die Sie Blick auf den nächsten Rahmen in der Kette, und so weiter, bis Sie in den globalen Bereich. Wenn die anonyme Funktion zurückgegeben wird, und
bind
abgeschlossen ist, wird die anonyme Funktion noch eine Referenz aufbind
's scope, sobind
's scope nicht "Weg".Angesichts all der oben, Sie sollten jetzt in der Lage sein zu verstehen, wie der Bereich funktioniert im folgenden Beispiel, und warum die Technik für die man eine Funktion um "pre-gebunden" mit einem bestimmten Wert
this
es haben wird, wenn es ist, die Werke genannt werden:InformationsquelleAutor Jonny Buchanan
Ja. Und ja.
Sinne des
this
ist ziemlich einfach ableiten:this
verwendet wird, in einem Konstruktor-Funktion, und die Funktion aufgerufen wurde, mit dernew
Schlüsselwortthis
bezieht sich auf das Objekt, das erstellt wird.this
weiterhin bedeuten, das Objekt auch in der öffentlichen Methoden.this
wird verwendet, überall sonst, einschließlich verschachtelter geschützt Funktionen, es bezieht sich auf die Globale Reichweite (was in dem Fall der browser ist das Fenster-Objekt).Zweiten Fall ist offensichtlich ein Konstruktionsfehler, aber es ist ziemlich leicht zu umgehen, indem man mit Schließungen.
InformationsquelleAutor Rakesh Pai
In diesem Fall die innere
this
gebunden ist an das Globale Objekt statt derthis
variable der äußeren Funktion.Es ist die Art, wie die Sprache gestaltet ist.
Finden Sie unter "JavaScript: The Good Parts" von Douglas Crockford für eine gute Erklärung.
InformationsquelleAutor Santiago Cepas
Fand ich ein nettes tutorial über die ECMAScript diese
Jedes Objekt kann verwendet werden, wie dies dem Wert des Kontextes.
Diese Funktion ist sehr wichtig, denn im Gegensatz zu Variablen, die diesen Wert nie beteiligt sich an identifier resolution process. I. e. beim Zugriff auf diese in einem code, dessen Wert direkt aus der Ausführungskontext und ohne scope-chain-lookup. Der Wert ist bestimmt nur einmal beim betreten der Kontext.
Im globalen Kontext, ein diesen Wert, wird das Globale Objekt selbst (das heißt, dieser Wert hier gleich variable-Objekt)
Im Falle einer Funktion, Kontext, wird dieser Wert in jede einzelne Funktion aufrufen, können unterschiedlich sein
Referenz Javascript-the-core und Kapitel-3-diese
InformationsquelleAutor Damodaran