Durch die Verwendung von Instanzmethoden als Rückruf für Ereignishandler wird der Bereich this
von "Meine Instanz" in "Wie auch immer der Rückruf genannt wird" geändert . Mein Code sieht also so aus
function MyObject() {
this.doSomething = function() {
...
}
var self = this
$('#foobar').bind('click', function(){
self.doSomethng()
// this.doSomething() would not work here
})
}
Es funktioniert, aber ist das der beste Weg, es zu tun? Es sieht seltsam für mich aus.
javascript
jquery
scope
closures
defnull
quelle
quelle
self
da es einwindow.self
Objekt gibt , das Sie möglicherweise versehentlich verwenden, wenn Sie vergessen, Ihre eigene Variable zu deklarierenself
(z. B. wenn Sie Code verschieben). Das Erkennen / Debuggen kann ärgerlich sein. Besser so etwas zu benutzen_this
.this
ist in JavaScript dynamisch. Er wird bestimmt, wenn eine Funktion aufgerufen wird , nicht, wenn sie deklariert wird."self === this
. Daher istself
in lokalen Kontexten sinnvoll und folgt dem Muster.Antworten:
Diese Frage ist nicht spezifisch für jQuery, sondern allgemein für JavaScript. Das Kernproblem besteht darin, wie eine Variable in eingebetteten Funktionen "kanalisiert" wird. Dies ist das Beispiel:
Diese Technik beruht auf der Verwendung eines Verschlusses. Es funktioniert jedoch nicht,
this
dathis
es sich um eine Pseudovariable handelt, die sich dynamisch von Bereich zu Bereich ändern kann:Was können wir tun? Weisen Sie es einer Variablen zu und verwenden Sie es über den Alias:
this
ist in dieser Hinsicht nicht eindeutig:arguments
ist die andere Pseudovariable, die auf die gleiche Weise behandelt werden sollte - durch Aliasing.quelle
Ja, dies scheint ein allgemeiner Standard zu sein. Einige Programmierer benutzen sich selbst, andere benutzen mich. Es wird als Referenz zurück auf das "echte" Objekt im Gegensatz zum Ereignis verwendet.
Es hat etwas gedauert, bis ich es wirklich verstanden habe. Zuerst sieht es seltsam aus.
Normalerweise mache ich das ganz oben auf meinem Objekt (entschuldigen Sie meinen Demo-Code - er ist konzeptioneller als alles andere und keine Lektion in exzellenter Codiertechnik):
quelle
edit: Trotzdem übernehmen verschachtelte Funktionen innerhalb eines Objekts eher das globale Fensterobjekt als das umgebende Objekt.
quelle
var self = this
funktioniert, aber das ist nicht das, was die Frage stellt (die Frage lautet, ob dies die beste Lösung für das Problem ist).Wenn Sie ES2015 oder Typenskript und ES5 ausführen, können Sie Pfeilfunktionen in Ihrem Code verwenden, und dieser Fehler tritt nicht auf. Dies bezieht sich auf den gewünschten Bereich in Ihrer Instanz.
quelle
this
aus ihrem definierenden Bereich. Normale Funktionsdefinitionen machen das nicht.Eine Lösung hierfür besteht darin, Ihren gesamten Rückruf mit der
bind
Methode von Javascript an Ihr Objekt zu binden .Sie können dies mit einer benannten Methode tun.
Oder mit einem anonymen Rückruf
Wenn Sie dies tun, anstatt auf
var self = this
etwas zurückzugreifen, verstehen Sie, wie sich die Bindung vonthis
in Javascript verhält und nicht auf eine Abschlussreferenz angewiesen ist.Außerdem ist der Fettpfeiloperator in ES6 im Grunde derselbe wie ein Aufruf
.bind(this)
einer anonymen Funktion:quelle
Ich habe jQuery nicht verwendet, aber in einer Bibliothek wie Prototype können Sie Funktionen an einen bestimmten Bereich binden. In diesem Sinne würde Ihr Code folgendermaßen aussehen:
Die bind-Methode gibt eine neue Funktion zurück, die die ursprüngliche Methode mit dem von Ihnen angegebenen Bereich aufruft.
quelle
$('#foobar').ready('click', this.doSomething.call(this));
richtig?bind
Methode funktioniert in älteren Browsern nicht. Verwenden Sie$.proxy
stattdessen die Methode.Fügen Sie einfach hinzu, dass Sie dies in ES6 aufgrund von Pfeilfunktionen nicht tun müssen, da diese den
this
Wert erfassen .quelle
Ich denke, es hängt tatsächlich davon ab, was Sie in Ihrer
doSomething
Funktion tun werden. Wenn SieMyObject
mit diesem Schlüsselwort auf Eigenschaften zugreifen möchten , müssen Sie dies verwenden. Ich denke aber, dass das folgende Codefragment auch funktioniert, wenn Sie keine besonderen Dinge mitobject(MyObject)
Eigenschaften tun .quelle