Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Referencing "this" inside setInterval/setTimeout within object prototype methods [duplicate]

Normally I'd assign an alternative "self" reference when referring to "this" within setInterval. Is it possible to accomplish something similar within the context of a prototype method? The following code errors.

function Foo() {} Foo.prototype = {     bar: function () {         this.baz();     },     baz: function () {         this.draw();         requestAnimFrame(this.baz);     } }; 
like image 594
Huck Avatar asked Oct 25 '11 14:10

Huck


People also ask

What is the difference between setTimeout and setInterval methods?

setTimeout allows us to run a function once after the interval of time. setInterval allows us to run a function repeatedly, starting after the interval of time, then repeating continuously at that interval.

Does setInterval repeat?

Yes, setInterval repeats until you call clearInterval with the interval to stop.

What is setInterval and setTimeout?

setTimeout(function, milliseconds ) Executes a function, after waiting a specified number of milliseconds. setInterval(function, milliseconds ) Same as setTimeout(), but repeats the execution of the function continuously.

How do you run setInterval 5 times?

“setinterval for 5 times” Code Answer'svar intervalID = setInterval(alert, 1000); // Will alert every second. // clearInterval(intervalID); // Will clear the timer. setTimeout(alert, 1000); // Will alert once, after a second.


1 Answers

Unlike in a language like Python, a Javascript method forgets it is a method after you extract it and pass it somewhere else. You can either

Wrap the method call inside an anonymous function

This way, accessing the baz property and calling it happen at the same time, which is necessary for the this to be set correctly inside the method call.

You will need to save the this from the outer function in a helper variable, since the inner function will refer to a different this object.

var that = this; setInterval(function(){     return that.baz(); }, 1000); 

Wrap the method call inside a fat arrow function

In Javascript implementations that implement the arrow functions feature, it is possible to write the above solution in a more concise manner by using the fat arrow syntax:

setInterval( () => this.baz(), 1000 ); 

Fat arrow anonymous functions preserve the this from the surrounding function so there is no need to use the var that = this trick. To see if you can use this feature, consult a compatibility table like this one.

Use a binding function

A final alternative is to use a function such as Function.prototype.bind or an equivalent from your favorite Javascript library.

setInterval( this.baz.bind(this), 1000 );  //dojo toolkit example: setInterval( dojo.hitch(this, 'baz'), 100); 
like image 140
hugomg Avatar answered Sep 28 '22 11:09

hugomg