6

我有一个看起来像这样的对象链:

Game.world.update()

我想使用 requestAnimationFrame 来确定这个函数的帧率。

但是,当我这样实现它时:

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

范围从世界对象变为窗口对象。如何在调用 requestAnimationFrame() 时保持我想要的范围?我知道它与匿名函数等有关,但我无法理解它。

4

3 回答 3

11

通常的方法,适用于任何地方:

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

或者使用 ES5 Function.prototype.bind兼容性):

World.prototype.update = function()
{
    requestAnimationFrame(this.update.bind(this)});
}
于 2013-10-31T13:17:05.317 回答
1

另一种方法是使用 lambda 表达式,如下所示:

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

这也保持了范围,但它有点清洁。

于 2017-06-04T17:32:49.963 回答
0
Game.world.update.call(scope);

范围是您要传递的任何范围。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call#Description

于 2013-10-31T13:12:09.743 回答