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:
Bedenken 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 < document.images.length; i++) { if (document.images[i].id.indexOf(name) > 1) { return document.images[i]; } } };
Ein 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, um den korrekten Ausführungskontext beizubehalten.
Das obige ist der detaillierte Inhalt vonWie behalte ich die \'this\'-Referenz bei der Verwendung von setTimeout in JavaScript bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!