Javascript "dieser" Zeiger innerhalb der verschachtelten Funktion
Ich habe eine Frage im Bezug auf den "this" - Zeiger werden in einer verschachtelten Funktion Szenario.
Sagen, dass ich einfügen das folgende Beispiel-code in eine web-Seite. Ich erhalte eine Fehlermeldung, wenn ich rufen Sie die verschachtelte Funktion "doSomeEffects()". Überprüfte ich in Firebug, und es zeigt, dass, wenn ich in dieser geschachtelten Funktion, der Zeiger "this" ist eigentlich Hinweis auf den globalen "window" - Objekt - das hatte ich nicht erwartet. Ich muss nicht Verständnis etwas richtig, weil ich dachte, da ich erklärte, die verschachtelte Funktion innerhalb einer Funktion des Objektes, es müsste "local" Umfang in Bezug auf die Funktion (d.h. der Zeiger "this" würde sich auf das Objekt selbst mag, wie es in meinem ersten "if" - Anweisung).
Alle Zeiger (kein Wortspiel beabsichtigt) würde geschätzt.
var std_obj = {
options : { rows: 0, cols: 0 },
activeEffect : "none",
displayMe : function() {
//the 'this' pointer is referring to the std_obj
if (this.activeEffect=="fade") { }
var doSomeEffects = function() {
//the 'this' pointer is referring to the window obj, why?
if (this.activeEffect=="fade") { }
}
doSomeEffects();
}
};
std_obj.displayMe();
this
bezieht sich auf das Objekt, auf dem die Funktion aufgerufen wird. var self = this;
und dann siehe self
die innere Funktion über die Schließung. doSomeEffects
ist nicht mit einem obj in allem, also this
, wird angenommen, dass die Fenster, die Mutter aller Elemente. InformationsquelleAutor der Frage JoJoeDad | 2012-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
In JavaScript die
this
Objekt ist, basierend auf, wie Sie Ihre Funktionsaufrufe.Im Allgemeinen gibt es drei Möglichkeiten, um den setup -
this
Objekt:someThing.someFunction(arg1, arg2, argN)
someFunction.call(someThing, arg1, arg2, argN)
someFunction.apply(someThing, [arg1, arg2, argN])
In allen obigen Beispielen die
this
ObjektsomeThing
.Aufruf einer Funktion ohne führende übergeordnete Objekt in der Regel bekommen Sie die globalen Objekt, das in den meisten Browsern bedeutet das
window
Objekt.InformationsquelleAutor der Antwort KylePDavis
this
ist nicht Teil des Verschluss-Bereichs, es kann gedacht werden, als zusätzlichen parameter an die Funktion gebunden ist an der call-site. Wenn die Methode nicht aufgerufen wird, als eine Methode, dann die global-Objekt übergeben, alsthis
. Im browser wird das Globale Objekt ist identisch mitwindow
. Betrachten Sie beispielsweise die folgenden funciton,und dem folgenden Objekt,
Wenn Sie rufen Sie die Funktion unter Verwendung der Methode syntax wie
dann
this
gebunden istobj
.Wenn Sie anrufen someFunction() direkt, wie
dann
this
gebunden ist an das Globale Objekt, das istwindow
.Die gemeinsame Arbeit um zu erfassen, diese in die Schließung, wie
InformationsquelleAutor der Antwort chuckj
Da dies scheint bei den meisten von Ihnen positiv bewertet werden Fragen dieser Art, und lassen Sie mich hinzufügen, nach all den Jahren, die ES6-Lösung mit Pfeil-Funktionen:
InformationsquelleAutor der Antwort
Gibt es einen Unterschied zwischen Gehäuse Variablen und "this". "this" ist tatsächlich definiert, durch die der Aufrufer der Funktion, während explizite Variablen intakt bleiben innerhalb der Funktion Erklärung-block bekannt als das Gehäuse. Siehe Beispiel unten:
können Sie versuchen es hier:
http://jsfiddle.net/kSTBy/
Was in Ihrer Funktion ist "doSomeEffects()", wird explizit aufgerufen, dies bedeutet, dass der Kontext oder das "diese" von der Funktion ist das Fenster. wenn "doSomeEffects" war ein Prototyp-Methode, z.B. dieser.doSomeEffects auf sagen, "myObject", dann myObject.doSomeEffects() würde dazu führen, "dieses" zu sein "myObject".
InformationsquelleAutor der Antwort Shane
, Diese Frage zu verstehen , versuchen, den Ausgang für das folgende snippet
Den obigen code wird die Ausgabe der folgenden auf der Konsole:
In der äußeren Funktion, sowohl als auch selbst finden myObject und daher können beide ordnungsgemäß Verweis und Zugriff auf foo.
In der inneren Funktion, aber dies bezieht sich nicht länger auf myObject. Als Ergebnis dieser.foo ist nicht definiert, in der die innere Funktion, in der Erwägung, dass der Verweis auf die lokale variable selbst bleibt im Rahmen und ist zugänglich. (Vor ECMA-5, das in der inneren Funktion beziehen sich auf das Globale window-Objekt; in der Erwägung, dass, als der ECMA-5, das in der inneren Funktion wäre nicht definiert.)
InformationsquelleAutor der Antwort ronakshah725
Als erklärt Kyle, Sie könnte verwenden
call
oderapply
angebenthis
innerhalb der Funktion:Hier wird das Konzept angewendet, um Ihren code:
JsFiddle
InformationsquelleAutor der Antwort Floyd Pink
können Sie es auch durch .bind () - Methode,
wir können tatsächlich setzen Sie den Wert dieses explizit mit call(), bind () und apply() . Die drei sind sich sehr ähnlich, aber es ist wichtig zu verstehen, die geringfügige Unterschiede.
Nennen und Anwenden, sind jeweils aufgerufen, sofort. - Aufruf eine beliebige Anzahl von Parametern: diese, gefolgt von den zusätzlichen Argumente. Gelten, nimmt nur zwei Parameter: dies ist, gefolgt von einer Reihe von zusätzlichen Argumenten.
Folgst du mir noch? Ein Beispiel soll dies verdeutlichen. Betrachten Sie den code unten. Wir versuchen, zahlen zu addieren. Kopieren Sie diesen in Ihren browser-Konsole und rufen Sie die Funktion auf.
Die Funktion " add-Protokolle NaN (not a number). Das ist, weil dieser.eine und diese.b nicht definiert sind. Sie nicht existieren. Und Sie können nicht fügen Sie eine Nummer, um etwas, das nicht definiert ist.
Ermöglicht das einführen eines Objekts in die Gleichung mit ein. Wir können mithilfe von call() und apply() zum Aufruf der Funktion mit unseren Objekt:
Wenn wir hinzufügen.call() der erste parameter ist das, was diese gebunden werden soll. Die nachfolgenden Parameter werden übergeben in der Funktion, die wir aufrufen. So, in der add() , dies.eine bezieht sich auf zehn.eine und diese.b bezieht sich auf zehn.b und wir erhalten 1+2+3+4 zurückgegeben wird, oder 10.
hinzufügen.apply() ist ähnlich. Der erste parameter ist das, was diese gebunden werden soll. Der nachfolgende parameter ist ein array der Argumente, die verwendet werden in der Funktion.
Was Binden? Die Parameter in bind() identisch sind zu nennen (), aber bind() wird nicht aufgerufen, sofort. Stattdessen bind() gibt eine Funktion mit dem Rahmen dieser bereits gebunden. Weil dieses, bind() ist nützlich, wenn wir nicht wissen, alle unsere Argumente vor. Wieder ein Beispiel soll helfen, mit Ihrem Verständnis:
Kopieren Sie die oben in der Konsole. Dann rufen Sie
Cool. Nichts neues hier. Was aber, wenn wir wollen, dass Sie den Wert des großen.eine statt? Wir können verwenden Sie call/apply:
Nun, was, wenn wir nicht wissen, alle 3 Argumente noch? Wir können binden:
Wenn wir die Konsole.log-unsere variable vor, bindTest , können wir sehen, woran wir arbeiten mit
Denken Sie daran, mit binden einer Funktion zurückgegeben wird, hat bereits diese gebunden! Also unsere diese wurde erfolgreich an unsere großen Objekt. Wir haben auch schon übergeben in unsere zweite argument als die Nummer 2. Später, wenn die restlichen Argumente, die wir weitergeben können, in:
Für Klarheit, hier ist der gesamte code zusammen in einem block. Schauen Sie vorbei, und kopieren Sie Sie in Ihre Konsole, um wirklich zu verstehen, was passiert ist!
Erinnere mich an ein paar Dinge:
Den Wert dieser ist in der Regel bestimmt durch eine Funktion Ausführungskontext.
Im globalen Bereich, dies bezieht sich auf das Globale Objekt (window-Objekt).
Wenn das new-Schlüsselwort wird verwendet(ein Konstruktor), das gebunden ist an das neue Objekt erzeugt wird.
Wir können den Wert dieses explizit mit call(), bind () und apply().
Pfeil-Funktionen nicht binden diese — statt diese ist gebunden lexikalisch (D. H. basierend auf den original-Kontext)
InformationsquelleAutor der Antwort Hitesh Kansagara