„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 behalte ich die \"this\"-Referenz bei der Verwendung von setTimeout in JavaScript bei?

Wie behalte ich die \"this\"-Referenz bei der Verwendung von setTimeout in JavaScript bei?

Veröffentlicht am 22.12.2024
Durchsuche:812

How to Preserve the \

setTimeout und das schwer fassbare „this“ in JavaScript

Bei der Verwendung der setTimeout-Funktion stoßen Entwickler häufig auf ein Problem, bei dem nachfolgende Aufrufe von Methoden verloren gehen ihrem beabsichtigten Kontext, was zu scheinbar undefinierten Methoden führt. Dies wird typischerweise durch den Verlust der „this“-Referenz verursacht.

Das Problem:

Betrachten Sie den folgenden Code:

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, 5000);
};

test.prototype.method2 = function(name) {
    for (var i = 0; i  1) {
            return document.images[i];
        }
    }
};

Beim ersten Laden der Seite funktioniert die Funktion method2 wie vorgesehen. Nach dem Festlegen des Timeouts führen nachfolgende Aufrufe von Methode2 jedoch zu einem Fehler, der darauf hinweist, dass sie undefiniert ist.

Die Lösung:

Das Kernproblem liegt in der Art und Weise, wie setTimeout damit umgeht das Schlüsselwort this. Beim Festlegen eines Timeouts mit setTimeout(this.method, 5000) geht der Kontext verloren, was zu dem Fehler führt.

Eine clevere Lösung für dieses Problem ist die Verwendung der bind()-Methode. Durch Anhängen von „.bind(this)“ an das Ende des Methodenaufrufs kann der Kontext explizit gebunden werden, wodurch sichergestellt wird, dass die korrekte „this“-Referenz auch nach dem Timeout beibehalten wird.

Verbesserter Code :

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
};

Mit dieser Änderung wird der Kontext von „this“ ordnungsgemäß gebunden, sodass Methode2 nach Ablauf des Timeouts weiterhin wie vorgesehen funktionieren kann. Dieser Ansatz ist sowohl elegant als auch effektiv bei der Beibehaltung des korrekten Ausführungskontexts.

Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729735477 Bei Verstößen 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