Wie übergebe ich den Kontext setTimeout
? Ich möchte anrufen, this.tip.destroy()
wenn this.options.destroyOnHide
nach 1000 ms. Wie kann ich das machen?
if (this.options.destroyOnHide) {
setTimeout(function() { this.tip.destroy() }, 1000);
}
Wenn ich das oben genannte versuche, this
bezieht sich auf das Fenster.
javascript
callback
this
settimeout
JamesBrownIsDead
quelle
quelle
Antworten:
BEARBEITEN: Zusammenfassend lässt sich sagen, dass 2010, als diese Frage gestellt wurde, der häufigste Weg zur Lösung dieses Problems darin bestand, einen Verweis auf den Kontext zu speichern, in dem der
setTimeout
Funktionsaufruf ausgeführt wird, dasetTimeout
die Funktion mit demthis
Verweis auf das globale Objekt ausgeführt wird:In der ES5-Spezifikation, die erst ein Jahr vor dieser Zeit veröffentlicht wurde, wurde die
bind
Methode eingeführt . Dies wurde in der ursprünglichen Antwort nicht vorgeschlagen, da sie noch nicht allgemein unterstützt wurde und Sie Polyfills benötigten, um sie zu verwenden, aber jetzt ist sie überall:Die
bind
Funktion erstellt eine neue Funktion mit demthis
vorgefüllten Wert.In der modernen JS ist dies genau das Problem, das Pfeilfunktionen in ES6 lösen :
Pfeilfunktionen haben keinen eigenen
this
Wert. Wenn Sie darauf zugreifen, greifen Sie auf denthis
Wert des umschließenden lexikalischen Bereichs zu.HTML5 standardisierte auch Timer im Jahr 2011, und Sie können jetzt Argumente an die Rückruffunktion übergeben:
Siehe auch:
quelle
this
die Funktion korrekt übergeben haben, haben Sie dieses Problem für diesen Fall, für map (), für forEach () usw. usw. mit weniger Code, weniger CPU-Zyklen und weniger Speicher gelöst. *** Siehe: Misha Reyzlins Antwort.Es gibt vorgefertigte Verknüpfungen (syntaktischer Zucker) zum Funktions-Wrapper @CMS, mit denen geantwortet wird. (Unter der Annahme, dass der gewünschte Kontext ist
this.tip
.)ECMAScript 5 ( aktuelle Browser , Node.js) und Prototype.js
Wenn Sie einen Browser verwenden, der mit ECMA-262, 5. Ausgabe (ECMAScript 5) oder Node.js kompatibel ist , können Sie diesen verwenden
Function.prototype.bind
. Sie können optional beliebige Funktionsargumente übergeben, um Teilfunktionen zu erstellen .Versuchen Sie in Ihrem Fall erneut Folgendes:
Die gleiche Funktionalität wurde auch in Prototype implementiert (irgendwelche anderen Bibliotheken?).
Function.prototype.bind
kann so implementiert werden, wenn Sie eine benutzerdefinierte Abwärtskompatibilität wünschen (beachten Sie jedoch die Hinweise).ECMAScript 2015 ( einige Browser , Node.js 5.0.0+)
Für innovative Entwicklung (2015) können Sie mit Fett Pfeil Funktionen , die sind Teil der ECMAScript 2015 (Harmonie / ES6 / ES2015) Spezifikation ( Beispiele ).
Versuchen Sie in Ihrem Fall Folgendes:
jQuery
Wenn Sie jQuery 1.4+ bereits verwenden, gibt es eine vorgefertigte Funktion zum expliziten Festlegen des
this
Kontexts einer Funktion.Versuchen Sie in Ihrem Fall Folgendes:
Underscore.js , lodash
Es ist in Underscore.js sowie in lodash als 1 , 2 verfügbar
_.bind(...)
Versuchen Sie in Ihrem Fall Folgendes:
binden jquery underscore.js Ecmascript-5 prototypejs node.js
quelle
func.bind(context...)
? Vermisse ich etwasvar boundFn = fn.bind(this); boundFn(); boundFn();
zum Beispiel.In anderen Browsern als Internet Explorer können Sie nach der Verzögerung gemeinsam Parameter an die Funktion übergeben:
Sie können dies also tun:
Dies ist in Bezug auf die Leistung besser als eine Scope-Suche (Zwischenspeichern
this
in eine Variable außerhalb des Timeout- / Intervallausdrucks) und anschließendes Erstellen eines Abschlusses (mithilfe von$.proxy
oderFunction.prototype.bind
).Der Code, mit dem es in IEs von Webreflection funktioniert :
quelle
HINWEIS: Dies funktioniert im IE nicht
quelle
Wenn Sie verwenden
underscore
, können Sie verwendenbind
.Z.B
quelle