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.
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