Ist var selbst = das; ein schlechtes Muster?
Finde ich mich brauchen:
var self = this;
viel in meine javascript - "Klasse". Obwohl dies Häufig getan, es fühlt sich ein bisschen falsch.
Was hoffe ich zu finden in dieser Frage ist eine bessere Möglichkeit, damit umzugehen, oder etwas, das mich davon zu überzeugen, das ist ganz in Ordnung.
Ist das der standard-Weg, um die richtigen Bindungen um? Sollte ich zu standardisieren, die auf der Verwendung von 'selbst' überall, es sei denn, ich habe ausdrücklich müssen 'diese'.
Bearbeiten: ich weiß genau, warum brauche ich das, ich Frage mich nur, ob es als ein bisschen böse und warum. Ich bin mir bewusst, es gibt auch die 'anwenden' built-in javascript-Funktion explizit definieren Umfang beim Aufruf einer Methode. Ist es besser?
var =
, was ich ehrlich gesagt gar nicht die Mühe der Suche in wenden/call, aber jetzt lese ich über diese Methoden, vielen Dank für diese Frage! InformationsquelleAutor der Frage Evert | 2010-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie schon andere gesagt haben: Diese "extra-variable" ist (auf irgendeiner Ebene) der einzige Weg, um über die Tatsache, dass
this
ist ein besonderer Ausdruck und so wird nicht eine variable, die nicht gebunden ist, in einem Ausführungskontext/Schließung.Jedoch, was ich denke, Sie Fragen (oder was ich wirklich will, zu beantworten) ist:
Zusammenfassung
Während ich versuchte, dieses eine mal, und hatte die gleiche Frage, die ich nicht mehr verwenden diesen Ansatz. Nun ich behalte mir das Konstrukt, wenn ich Zugriff benötigen einen Verschluss. Für mich ist es fügt ein wenig "hey, das ist, was ich wirklich will!" semantischen mein code:
this -> this
undself -> this (but really that) in a closure
Fragen ala carte:
Tun, was sich richtig anfühlt für Sie. Haben Sie keine Angst, um zu versuchen, eine Methode und wieder zurück wechseln, später (aber versuchen Sie bitte, konsistent zu bleiben in jedem Projekt 🙂
"selbst" ist der gebräuchlichste name verwendet. Nach oben, ich bevorzuge die umgekehrte Ansatz-zu verwenden
this
außer wenn eine Schließung Bindung erforderlich ist.Böse ist eine dumme subjektive Begriff (wenn auch oft Spaß). Ich habe nie gesagt, dass es böse war, nur warum ich nicht an den Ansatz. Einige Leute sagen mir, ich bin "böse" nicht mit einem Semikolon. Ich sage Ihnen, Sie sollte eigentlich kommen mit guten Argumenten und/oder JavaScript erlernen besser 🙂
Das problem mit
apply/call
ist, dass Sie müssen Sie an der Punkt-von der Funktions-Aufruf. Es wird nicht helfen, wenn jemand sonst ruft eine Ihrer Methoden, wie diethis
kann schon aus sein. Es ist besonders nützlich für Dinge wie die jQuery-Stil Rückrufe, wo diethis
ist das element/item von dem Rückruf, etc.Nebenbei...
Ich wie zu vermeiden, "brauchen selbst" auf die Mitglieder und damit in der Regel fördern alle member-Funktionen, um die Eigenschaften, wo der Empfänger (
this
) nur "fließt durch", die in der Regel "wie erwartet".Den "private" - Methoden in meinem code beginnt mit einem "_" und wenn der Nutzer Sie aufruft, dass auf Ihnen. Dies funktioniert auch besser (ist erforderlich) bei der Verwendung der Prototyp-Ansatz zur Objekt-Erstellung. Allerdings Douglas Crockford nicht einverstanden ist mit diesem "privaten" - Ansatz von mir, und es gibt einige Fälle, in denen die look-up-Kette möglicherweise vereiteln Sie durch die Injektion einer unerwarteten Empfänger:
Mit dem "selbst" gebunden ist, die im Konstruktor sperrt auch die Obere Grenze der look-up-Kette für eine Methode (es ist nicht mehr polymorphe nach oben!) die möglicherweise oder möglicherweise nicht korrekt. Ich denke, es ist in der Regel falsch.
Happy coding.
InformationsquelleAutor der Antwort
Ja, dies ist der standard-Weg.
Function.apply()
undFunction.call()
können helfen, aber nicht immer.Betrachten Sie die folgenden
Wenn Sie wollte, dies zu tun, aber vermeiden Sie die Verwendung einer Variablen wie
self
und verwendencall()
oderapply()
stattdessen... naja... man schaut Sie an und beginnen zu versuchen, aber bald erkennen Sie einfach nicht.setTimeout()
ist verantwortlich für den Aufruf des lambda-Ausdrucks, so dass es unmöglich für Sie zu nutzen, diese Alternative Aufruf-styles. Sie würde noch bis Ende erstellen einige vermittelnde variable zum speichern eines Verweises auf das Objekt.InformationsquelleAutor der Antwort Peter Bailey
Gibt es keine standard -, JavaScript-und Klasse - /Instanz-Systeme betroffen sind. Sie müssen wählen, welche Art von Objekt Modell, das Sie bevorzugen. Hier ist ein weiterer link zu einem backgrounder; Fazit: es gibt keine conlusion.
In der Regel halten eine Kopie
var self= this;
(*) in eine Verschluss geht hand-in-hand mit einem Objekt-Modell gebaut, um die Verschlüsse mit pro-Instanz-Kopien von jeder Methode. Das ist eine gültige Art und Weise, Dinge zu tun, ein bisschen weniger effizient, aber in der Regel auch ein bisschen weniger Arbeit als die alternative, ein Objekt-Modell gebaut, um prototyping, mitthis
,apply()
und ECMAScript Fifth Editionbind()
zu bekommen bound-Methoden.Was könnte mehr gezählt werden als 'böse' ist, wenn Sie haben ein mish-Brei der beiden Stile in den gleichen code. Leider eine Menge von common JS code wird dies (weil let ' s face it, niemand wirklich versteht JavaScript bizarre native object model).
(*: Ich in der Regel verwenden
that
stattself
; Sie können jeden beliebigen Namen verwenden, die Sie mögen, aberself
hat schon einen etwas obskuren und völlig sinnlos, also alswindow
Mitglied, das auf die Fenster selbst.)InformationsquelleAutor der Antwort bobince
Kam gerade über diese Frage, weil meine Kollegen die süchtig nach selbst/der Variablen, und ich wollte verstehen, warum...
Ich denke, es gibt einen besseren Weg, um mit diese in nowdays:
InformationsquelleAutor der Antwort
In javascript und anderen Sprachen mit Schließungen, kann dies eine sehr wichtige Sache zu tun. Das Objekt, das
this
bezieht sich auf eine Methode tatsächlich verändern. Sobald Sie Ihreself
variable gleichthis
, dann selbst bleibt zuverlässig ein Verweis auf das Objekt in Frage, auch wennthis
später auf etwas anderes.Dies ist ein wichtiger Unterschied in javascript im Vergleich zu vielen anderen Sprachen in denen wir arbeiten. Ich komme aus der .Net, so dass diese Art der Sache merkwürdig erschien mir zunächst auch.
Bearbeiten:
Ah, okay, Sie wissen das alles. (vielleicht noch hilfreich für jemanden.) Ich will hinzufügen, dass Gilt (und Nennen) sind mehr für die Verwendung von "außen", was auf eine Funktion, die Sie aufrufen eines bestimmten Bereichs, den Sie bereits kennen. Sobald Sie sich innerhalb einer Funktion, und Sie sind über die Kaskade weiter unten in Schließungen, die Technik:
ist der bessere Weg (einfach und klar) Art und Weise zu verankern, Ihre aktuellen Umfang.
InformationsquelleAutor der Antwort Patrick Karcher
Meisten wahrscheinlich, dass dies getan wird, als einen Weg zu halten eine Referenz auf
this
wenn der Umfang ändern wird (im Falle einer Schließung). Ich weiß nicht, dass ich halte es für eine schlechte Praxis oder Muster an und für sich, Nein. Sie sehen ähnliche Dinge, eine Menge mit Bibliotheken wie jQuery und viel mit arbeiten mit AJAX.InformationsquelleAutor der Antwort g.d.d.c
Ich denke, es ist ein argument gemacht werden, für die immer auch
var self = this
in jeder Methode: menschliche Faktoren.Es benötigt wird, oft genug, dass Sie wind mit einem Mischmasch von Methoden, die den Zugriff auf
this
und anderen mitself
für den gleichen Zweck. Wenn Sie verschieben Sie code von einem zum anderen, plötzlich hat man eine Reihe von Fehlern.Zur gleichen Zeit, ich ertappe mich geistesabwesend schreiben
self.foo
aus Gewohnheit, wenn ich noch nicht gebraucht werden oder Hinzugefügtvar self = this
. Also ich denke, es könnte Sinn machen, nur machen Sie eine Gewohnheit, die immer auch den es benötigt oder nicht.Das einzige Problem ist...
this
,self
oderthat
alle eine hässliche Pocken auf Ihrem code und ich hasse Sie alle. Also ich denke, es ist besser zu vermeiden, mit Delegierten Methoden, wo möglich, so dass Sie können vermeiden Sie die Verwendungthis
,that
oderself
die überwiegende Mehrheit der Zeit, und verwenden Sie.bind(this)
wenn Sie ansonsten im resort zuself
/that
. Es ist sehr selten, dass die Verwendung von Stellvertretern für den Prototyp wird die tatsächlich sparen Sie eine erhebliche Menge an Speicher sowieso.Ein schöner Nebeneffekt dieses Ansatzes ist, dass Sie nicht haben, um Präfix, alle privaten Variablen mit
_
werden, wie Sie wirklich privaten und öffentlichen Eigenschaften werden von den führendenthis.
, wodurch der code besser lesbar.Als bobince sagte
var that = this
ist besser, weil es nicht in shadowwindow.self
.self = this
klingt weniger umständlich zu mir, aber manchmal verwirrende Fehlermeldungen wieproperty myMethod not found on global
, weil man vergessen hat, dieself = this
Linie.InformationsquelleAutor der Antwort John Starr Dewar
Ich möchte nur darauf hinweisen, dass 'selbst' ist äquivalent zu 'Fenster', versuchen Sie die Ausgabe-Fenster === selbst auf der Konsole. Sie sollten diese Muster mit ',' oder etwas ähnliches wie eine variable Namen, vermeiden Sie die Verwendung von 'selbst' ist, da Sie bereits in Verwendung durch den browser (ein Fehler, und erstellen Sie sich selbst eine Globale variable).
Obwohl es klingt seltsam, ist es besser, zu verwenden ', die' zu seinem Namen, weil andere Entwickler werden sofort wissen, was Sie versuchen zu vollbringen, die Sie in Ihrem code vermeiden die Verwendung von nicht standardmäßigen Variablen-Namen.
Ich glaube, dass dies ist ein wichtiger Hinweis, aber es wurde nur erwähnt in einem Kommentar, so wollte ich, um es besser sichtbar zu machen.
InformationsquelleAutor der Antwort Goran Vasic
Ist es 6 Jahre später, und ich habe einige Dinge, die mich zu fügen:
bind()
ist jetzt allgemein genug, um überall eingesetzt werden. Ich benutze es Häufig als eine alternative. Manchmal fühlt es sich deutlicher. Ich immer noch gelegentlich verwendenvar self = this;
. obwohl.Pfeil-Funktionen langsam sind immer rentabel für die Nutzung. Die syntax ist ein wenig kürzer, was nett ist, aber ich denke, dass die killer-feature wirklich ist, dass standardmäßig, Sie binden immer an den übergeordneten Rahmen.
:
Kann jetzt geschrieben werden als :
Dies ist der 'optimistischen' Verwendung von Pfeil-Funktionen, aber es ist ziemlich süß.
Und einfach zu concluse, es ist nichts falsch mit:
InformationsquelleAutor der Antwort Evert
Ich mag es. Es ist das "selbst"erklärend. Douglas Crockford hat einige Dinge zu sagen über diese. Er Staaten, dass die Verwendung von "dass" ist Konvention. Sie können sehen, Crockford kostenlos, wenn Sie rutschen über zu yui-theater und Uhr hes-videos über Javascript.
InformationsquelleAutor der Antwort Phluks