请求动画帧范围更改为窗口

requestAnimationFrame scope change to window

本文关键字:窗口 范围 动画 请求      更新时间:2023-09-26

我有一串对象,看起来像这样:

Game.world.update()

我想使用 requestAnimationFrame 来确定此函数的帧速率。

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

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

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

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

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

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

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

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

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

这也保持了范围,但它更干净一些。

Game.world.update.call(scope);

其中范围是要传入的任何范围。

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