因此,我尝试创建一个“ 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/