Home > Article > Web Front-end > How to Preserve the \'this\' Reference When Using setTimeout in JavaScript?
setTimeout and the Elusive "this" in JavaScript
When using the setTimeout function, developers often encounter an issue where subsequent calls to methods lose their intended context, resulting in seemingly undefined methods. This is typically caused by the loss of the "this" reference.
The Problem:
Consider the following 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]; } } };
On initial page load, the method2 function works as intended. However, after setting the timeout, subsequent calls to method2 result in an error indicating that it's undefined.
The Solution:
The core issue lies in the way setTimeout handles the this keyword. When setting a timeout using setTimeout(this.method, 5000), the context is lost, resulting in the error.
A clever solution to this problem is to use the bind() method. By appending ".bind(this)" to the end of the method call, the context can be explicitly bound, ensuring that the correct "this" reference is maintained even after the timeout.
Improved 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 };
With this modification, the context of "this" is properly bound, allowing method2 to continue functioning as intended after the timeout expires. This approach is both elegant and effective in preserving the correct execution context.
The above is the detailed content of How to Preserve the \'this\' Reference When Using setTimeout in JavaScript?. For more information, please follow other related articles on the PHP Chinese website!