„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie bleibt der Kontext mit „this“ erhalten, wenn „setTimeout“ in JavaScript verwendet wird?

Wie bleibt der Kontext mit „this“ erhalten, wenn „setTimeout“ in JavaScript verwendet wird?

Veröffentlicht am 09.11.2024
Durchsuche:833

How to Preserve Context with `this` When Using `setTimeout` in JavaScript?

Verwenden von setTimeout und Beibehalten des Kontexts damit in JavaScript

Bei der Verwendung der setTimeout-Funktion in JavaScript ist es wichtig, sich darüber im Klaren zu sein, wie sie funktioniert den Kontext dazu. Dies wird besonders relevant, wenn Methoden aufgerufen werden, die in einem anderen Kontext innerhalb des Timeout-Callbacks definiert sind.

Im bereitgestellten Code-Snippet ruft die Methodenfunktion Methode2 auf, die ein Bildelement basierend auf einer übergebenen ID abruft und seine src-Eigenschaft festlegt . Methode2 wird zunächst erfolgreich ausgeführt. Nach der setTimeout-Verzögerung tritt jedoch ein Fehler auf, da die Funktion method2 nicht mehr im vorgesehenen Kontext definiert ist.

Das Problem tritt auf, weil setTimeout einen neuen Ausführungskontext erstellt und das Schlüsselwort this standardmäßig das globale Objekt verwendet. Im bereitgestellten Code wird die Methodenfunktion mit dem Kontext des Testprototyps aufgerufen, aber wenn der Timeout-Callback ausgeführt wird, hat sich dieser Kontext in das globale Objekt geändert.

Lösung:

Um den beabsichtigten Kontext innerhalb des Timeout-Callbacks beizubehalten, können Sie die .bind()-Methode verwenden, um die Bindung des Kontexts explizit festzulegen. Durch Anhängen von .bind(this) an das Ende der Funktion, die an setTimeout übergeben wird, können Sie sicherstellen, dass sich dies innerhalb der Rückruffunktion auf den beabsichtigten Kontext bezieht.

Im aktualisierten Codeausschnitt:

test.prototype.method = function()
{
    //method2 returns image based on the id passed
    this.method2('useSomeElement').src = "http://www.some.url";
    timeDelay = window.setTimeout(this.method.bind(this), 5000);
    //                                       ^^^^^^^^^^^ <- fix context
};

Durch Hinzufügen von .bind(this) wird das Schlüsselwort this innerhalb der Rückruffunktion an den Testprototyp gebunden, sodass Methode2 auch nach der setTimeout-Verzögerung korrekt im Kontext der Prototypmethode aufgerufen werden kann.

Freigabeerklärung Dieser Artikel wird reproduziert unter: 1729735296 Wenn ein Verstoß vorliegt, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3