在主程序中,我随机选择一个我想要动画的对象,所以我用对象作为参数调用该函数。第一个循环没问题,X设置得很好,但在下一个回合中它变得不确定。
这样的事情:
var anim = {
mainFunc: function(x) {
anim.update(x);
anim.redraw(x);
window.requestAnimationFrame(anim.mainFunc);
},
update: function(x) {
},
redraw: function(x) {
}
};
var n=Math.floor(Math.random() * (ArrayOfAnimObject.length));
anim.mainFunc(ArrayOfAnimObject[n]);
答案 0 :(得分:37)
您需要创建一个引用或将函数调用包装在另一个函数中,如下所示:
mainFunc: function(x) {
anim.update(x);
anim.redraw(x);
window.requestAnimationFrame(function() {
anim.mainFunc(x);
});
}
答案 1 :(得分:18)
您也可以使用.bind
。
mainFunc: function(x) {
anim.update(x);
anim.redraw(x);
window.requestAnimationFrame(anim.mainFunc.bind(anim,x));
}
答案 2 :(得分:0)
最好是避免这样做。
允许您执行此操作的解决方案将要求您创建一个新功能(无论是@kalley答案的匿名包装,还是@ ArchyWillHe's的绑定包装)每一帧。
在动画循环中,您希望保留尽可能少的可收集对象,以使垃圾收集器在动画运行时不必踢进来,从而可以杀死几帧。
要执行此操作,您可以使用不同的策略,但是例如在OP中公开的情况下,此x
参数可能应该直接附加到anim
对象上:
var anim = {
mainFunc: function() {
anim.update();
anim.redraw();
window.requestAnimationFrame(this.mainFunc);
},
update: function() {
this.x ++;
},
redraw: function() {
log.textContent = this.x;
}
};
// replace it with a bound function only once
anim.mainFunc = anim.mainFunc.bind(anim);
anim.x = 0; // attach the parameter to the anim object
anim.mainFunc();
<pre id="log"></pre>
可能还希望仅将此参数保留为对调用方和anim
都可用的变量:
(function() {
var anim = {
mainFunc: function() {
anim.update();
anim.redraw();
window.requestAnimationFrame(anim.mainFunc);
},
update: function() {
x ++;
},
redraw: function() {
log.textContent = x;
}
};
var x = 0; // available for both us and anim's method
anim.mainFunc();
})();
<pre id="log"></pre>