Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

requestAnimationFrame scope change to window

I have a chain of objects that looks like this:

Game.world.update()

I would like to use requestAnimationFrame to determine the framerate of this function.

However when I implement it like this:

World.prototype.update = function()
{
    requestAnimationFrame(this.update);
}

The scope changes from the world object to the window object. How do I maintain the scope I want while calling requestAnimationFrame()? I know it has something to do with anonymous functions and such, but I can't get my head around it.

like image 236
mipmap Avatar asked Oct 31 '13 13:10

mipmap


2 Answers

Usual approach, works everywhere:

World.prototype.update = function()
{
    var self = this;
    requestAnimationFrame(function(){self.update()});
}

Or with ES5 Function.prototype.bind (compatibility):

World.prototype.update = function()
{
    requestAnimationFrame(this.update.bind(this)});
}
like image 94
Jakub Roztocil Avatar answered Nov 07 '22 16:11

Jakub Roztocil


Another way of doing this is to use a lambda expression like so:

requestAnimationFrame((timestamp) => { loop(timestamp) });

This also maintains scope but it's a bit cleaner.

like image 20
otoomey Avatar answered Nov 07 '22 16:11

otoomey