In der Quelle für WebKit HTML 5 SQL Storage Notes Demo wurde Folgendes angezeigt :
function Note() {
var self = this;
var note = document.createElement('div');
note.className = 'note';
note.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
note.addEventListener('click', function() { return self.onNoteClick() }, false);
this.note = note;
// ...
}
Der Autor verwendet selbst an einigen Stellen (die Funktion Körper) und diese an anderen Orten (die Leichen in der Liste der Argumente von Methoden definiert Funktionen). Was ist los? Jetzt, wo ich es einmal bemerkt habe, werde ich es überall sehen?
javascript
scope
closures
Thomas L Holaday
quelle
quelle
this
innerhalb eines Rückrufs auf das Richtige zugreifen ?")Antworten:
Siehe diesen Artikel auf alistapart.com . (Ed: Der Artikel wurde seit dem ursprünglichen Link aktualisiert)
self
wird verwendet, um einen Verweis auf das Original beizubehalten,this
auch wenn sich der Kontext ändert. Diese Technik wird häufig in Event-Handlern verwendet (insbesondere bei Verschlüssen).Bearbeiten: Beachten Sie, dass die Verwendung
self
jetzt nicht mehr empfohlen wirdwindow.self
und möglicherweise Fehler verursacht, wenn Sie nicht vorsichtig sind.Was Sie die Variable nennen, spielt keine besondere Rolle.
var that = this;
ist in Ordnung, aber der Name hat nichts Magisches.In einem Kontext deklarierte Funktionen (z. B. Rückrufe, Abschlüsse) haben Zugriff auf die Variablen / Funktionen, die im selben Bereich oder darüber deklariert wurden.
Zum Beispiel ein einfacher Ereignisrückruf:
quelle
var that = this;
Ich denke, der Variablenname 'self' sollte nicht mehr auf diese Weise verwendet werden, da moderne Browser eine globale Variable
self
bereitstellen , die auf das globale Objekt eines normalen Fensters oder eines WebWorkers verweist.Um Verwirrung und mögliche Konflikte zu vermeiden, können Sie schreiben
var thiz = this
odervar that = this
stattdessen.quelle
_this
that
" (woran sich mein Gehirn nie gewöhnen wird).self
zu verwenden, solange Sie ihn alsvar
iable deklarieren. Er wird das Globale beschatten. Wenn Sie das vergessenvar
hätten, würde es natürlich auch mit keinem anderen Namen funktionieren.Ja, du wirst es überall sehen. Es ist oft
that = this;
.Sehen Sie, wie
self
in Funktionen verwendet wird, die von Ereignissen aufgerufen werden? Diese würden ihren eigenen Kontext haben, alsoself
wird verwendet, um das zu haltenthis
, was hereinkamNote()
.Der Grund
self
, der den Funktionen weiterhin zur Verfügung steht, obwohl sie erst ausgeführt werden können, nachdem dieNote()
Funktion ausgeführt wurde, besteht darin, dass innere Funktionen aufgrund des Schließens den Kontext der äußeren Funktion erhalten .quelle
self
keine besondere Bedeutung hat. Ich persönlich bevorzuge es, eine Variable mit einem anderen Namen zu verwenden, alsself
dies mich häufig verwirrt, da ich erwarte, dass 'Selbst' ein reserviertes Wort ist. Also ich mag deine Antwort. Und im Beispiel des OP würde ich es vorziehenvar thisNote = this
oder ähnliches.Es sollte auch beachtet werden, dass es ein alternatives Proxy-Muster gibt, um einen Verweis auf das Original
this
in einem Rückruf beizubehalten, wenn Sie das nicht mögenvar self = this
Redewendung nicht .Da eine Funktion mit einem bestimmten Kontext mithilfe von
function.apply
oder aufgerufen werdenfunction.call
kann, können Sie einen Wrapper schreiben, der eine Funktion zurückgibt, die Ihre Funktion mitapply
oder untercall
Verwendung des angegebenen Kontexts aufruft .proxy
Eine Implementierung dieses Musters finden Sie in der Funktion von jQuery . Hier ist ein Beispiel für die Verwendung:var wrappedFunc = $.proxy(this.myFunc, this);
wrappedFunc
kann dann aufgerufen werden und hat Ihre Versionthis
als Kontext.quelle
Wie andere erklärt haben,
var self = this;
erlaubt Code in einem Abschluss auf den übergeordneten Bereich zurückgreifen.Es ist jedoch jetzt 2018 und ES6 wird von allen gängigen Webbrowsern weitgehend unterstützt. Das
var self = this;
Redewendung ist nicht mehr so wichtig wie früher.Es ist jetzt möglich,
var self = this;
durch die Verwendung von Pfeilfunktionen zu vermeiden .In Fällen, in denen wir verwendet hätten
var self = this
:Wir können jetzt eine Pfeilfunktion verwenden ohne
var self = this
:Pfeilfunktionen haben keine eigenen
this
und nehmen einfach den umschließenden Bereich an.quelle
.addEventListender("click", (x) => { console.log(x); });
Sie das Wie und Warum sehr deutlich erklärt, und ich stimme zu, dass die Verwendung von Pfeilfunktionen sinnvoller ist, aber dennoch ... das ist einfach schrecklich, faul, chaotisch, Programmierung.Die Variable wird von den in der Methode definierten Inline-Funktionen erfasst.
this
in der Funktion wird auf ein anderes Objekt verweisen. Auf diese Weise können Sie festlegen, dass die Funktion einen Verweis auf denthis
im äußeren Bereich enthält.quelle
Es ist eine JavaScript-Eigenart. Wenn eine Funktion eine Eigenschaft eines Objekts ist, besser gesagt eine Methode, bezieht sich dies auf das Objekt. Im Beispiel eines Ereignishandlers ist das enthaltende Objekt das Element, das das Ereignis ausgelöst hat. Wenn eine Standardfunktion aufgerufen wird, dies wird auf das globale Objekt beziehen. Wenn Sie wie in Ihrem Beispiel verschachtelte Funktionen haben, bezieht sich dies überhaupt nicht auf den Kontext der äußeren Funktion. Innere Funktionen teilen den Gültigkeitsbereich mit der enthaltenen Funktion, sodass Entwickler Variationen von verwenden,
var that = this
um das zu erhalten, was sie in der inneren Funktion benötigen.quelle
Tatsächlich ist self ein Verweis auf window (
window.self
), wenn Sie also sagen, dassvar self = 'something'
Sie einen Fensterverweis auf sich selbst überschreiben - weil self im Fensterobjekt existiert.Dies ist , warum die meisten Entwickler bevorzugen
var that = this
übervar self = this;
Wie auch immer;
var that = this;
Dies entspricht nicht der bewährten Vorgehensweise. Unter der Annahme, dass Ihr Code später von anderen Entwicklern überarbeitet / geändert wird, sollten Sie die gängigsten Programmierstandards in Bezug auf die Entwicklergemeinschaft verwendenDaher sollten Sie so etwas wie var
oldThis
/var oThis
/ etc verwenden - um in Ihrem Bereich klar zu sein // ..ist nicht so viel, spart aber einige Sekunden und wenige Gehirnzyklenquelle
Wie oben mehrfach erwähnt, wird "Selbst" einfach verwendet, um vor dem Eintritt in die Funktion einen Verweis auf "dies" zu behalten. Einmal in der Funktion 'dies' bezieht sich auf etwas anderes.
quelle
thisss.sayHi.call (thatt);
quelle