Wie andere gesagt haben: Diese "zusätzliche Variable" ist (auf einer bestimmten Ebene) der einzige Weg, um die Tatsache zu umgehen, dass thises sich um einen speziellen Ausdruck handelt und daher, da sie keine Variable ist, nicht an einen Ausführungskontext / -abschluss gebunden ist.
Ich denke jedoch, dass Sie fragen (oder was ich wirklich beantworten möchte):
Sollte man var self = thisbei jeder Methode / jedem Konstruktor an die Spitze setzen ?
Zusammenfassung
Obwohl ich dies einmal versucht habe und dieselbe Frage hatte, verwende ich diesen Ansatz nicht mehr. Jetzt reserviere ich das Konstrukt für den Fall, dass ich Zugriff in einem Verschluss benötige. Für mich fügt es ein wenig hinzu "Hey, das ist was ich wirklich will!" semantisch zu meinem Code:
this -> this und self -> this (but really that) in a closure
Fragen à la carte:
... Obwohl dies üblicherweise gemacht wird, fühlt es sich ein bisschen falsch an. Was ich in dieser Frage zu finden hoffe, ist ein besserer Weg, damit umzugehen, oder etwas, das mich davon überzeugt, dass dies in Ordnung ist.
Tu, was sich für dich richtig anfühlt. Haben Sie keine Angst, eine Methode auszuprobieren und später zurückzuschalten (aber versuchen Sie bitte, in jedem Projekt konsistent zu bleiben :-)
Ist dies die Standardmethode, um die richtigen Bindungen beizubehalten? Sollte ich standardisieren, dass ich überall "Selbst" verwende, es sei denn, ich brauche ausdrücklich "Dies".
"self" ist der am häufigsten verwendete Name. Wie oben, bevorzuge ich den umgekehrten Ansatz - thisaußer wenn eine Verschlussbindung erforderlich ist.
..wenn es ein bisschen böse ist und warum.
Das Böse ist ein dummer subjektiver Begriff (wenn auch manchmal lustig). Ich habe nie gesagt, dass es böse ist, nur warum ich dem Ansatz nicht folge. Einige Leute sagen mir, ich sei "böse", weil ich keine Semikolons benutze. Ich sage ihnen, sie sollten sich eigentlich gute Argumente einfallen lassen und / oder JavaScript besser lernen :-)
Mir ist bekannt, dass es auch die integrierte Javascript-Funktion 'apply' gibt, mit der der Bereich beim Aufrufen einer Methode explizit definiert wird. Ist es besser?
Das Problem dabei apply/callist, dass Sie sie am Punkt des Funktionsaufrufs verwenden müssen. Es hilft nicht, wenn jemand anderes eine Ihrer Methoden aufruft, da die thismöglicherweise bereits deaktiviert ist. Dies ist am nützlichsten, wenn Sie beispielsweise Rückrufe im jQuery-Stil ausführen, bei denen thisdas Element / Element des Rückrufs usw. ist.
Nebenbei...
Ich möchte vermeiden, dass Mitglieder sich selbst brauchen, und daher generell alle Mitgliederfunktionen auf Eigenschaften übertragen, bei denen der Empfänger (this ) nur "durchfließt", was normalerweise "wie erwartet" ist.
Die "privaten" Methoden in meinem Code beginnen mit einem "_" und wenn der Benutzer sie aufruft, ist das auf ihnen. Dies funktioniert auch besser (ist wirklich erforderlich), wenn der Prototyp-Ansatz für die Objekterstellung verwendet wird. Allerdings Douglas Crockford nicht einverstanden mit diesem „privaten“ Ansatz von mir und es gibt einige Fälle , in denen die Look-up - Kette Sie durch Injizieren eines unerwarteten Empfänger vereiteln kann:
Die Verwendung des im Konstruktor gebundenen "Selbst" sperrt auch die Obergrenze der Suchkette für eine Methode (sie ist nicht mehr nach oben polymorph!), Die möglicherweise korrekt ist oder nicht. Ich denke es ist normalerweise falsch.
Viel Spaß beim Codieren.
var that = this, ich habe mich ehrlich gesagt nicht einmal darum gekümmert, mich zu bewerben / anzurufen, aber jetzt habe ich über diese Methoden gelesen, danke für diese Frage!