因此,我尝试创建一个“ Animator”模块,该模块基本上可以轻松启动和停止requestAnimationFrame循环

define(function(require, exports, module) {
  var a = require( 'js/lib/stats.min.js'  );

  function Animator(){

    this.stats = new Stats();
    this.stats.domElement.style.position  = 'absolute';
    this.stats.domElement.style.bottom    = '0px';
    this.stats.domElement.style.right     = '0px';
    this.stats.domElement.style.zIndex   = '999';

    this.requestAnimationFrame = requestAnimationFrame;

    document.body.appendChild( this.stats.domElement );


  }

  Animator.prototype.start = function(){
    this.animate( this );
  }

  Animator.prototype.stop = function(){

    if (requestId) {
      cancelAnimationFrame(this.requestId);
      this.requestId = undefined;
    }

  }

  Animator.prototype.animate = function( ){

    this.update();

    this.requestId = this.requestAnimationFrame( this.animate );

 }


 // Empty function, because it will be user defined
 Animator.prototype.update = function(){

 }

  return Animator

});


如您所知,我在这里做一些非法的事情:

首先,我试图将requestAnimationFrame分配给this.requestAnimationFrame。这是因为在原型的.animate函数上,我希望能够访问此对象的更新函数。问题是当我这样做时,就像这样:

Animator.prototype.animate = function( ){

  whichAnimator.update();

  whichAnimator.requestId = requestAnimationFrame( whichAnimator.animate( whichAnimator ) );

}


我得到了超出最大堆栈调用数。

我想我想知道这样做的最佳方法是什么,因为在这一点上,我显然不知道自己在做什么。

如有任何疑问,请询问,并感谢您的宝贵时间!

最佳答案

.bind做到了!

谢谢@kalley

Animator.prototype.start = function(){
  this.running = true;
  this.animate();
}

Animator.prototype.stop = function(){
  this.running  = false;
}

Animator.prototype.animate = function( ){

  this.stats.update();
  this.update();

  if( this.running == true ){
    window.requestAnimationFrame( this.animate.bind( this ) );
  }

}

关于javascript - requestAnimationFrame,是否非全局?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19471247/

10-12 01:32