有人能给我解释一下这个Javascript单例代码吗?
这个文件有人能给我解释一下这个Javascript单例代码吗?,javascript,singleton,Javascript,Singleton,这个文件 http://www.iguanademos.com/Jare/docs/html5/Lessons/Lesson2/js/GameLoopManager.js 取自 代码如下: // ---------------------------------------- // GameLoopManager // By Javier Arevalo var GameLoopManager =
http://www.iguanademos.com/Jare/docs/html5/Lessons/Lesson2/js/GameLoopManager.js
取自
代码如下:
// ----------------------------------------
// GameLoopManager
// By Javier Arevalo
var GameLoopManager = new function() {
this.lastTime = 0;
this.gameTick = null;
this.prevElapsed = 0;
this.prevElapsed2 = 0;
我理解变量的声明,
它们被用来记录两帧之间的时间
this.run = function(gameTick) {
var prevTick = this.gameTick;
this.gameTick = gameTick;
if (this.lastTime == 0)
{
// Once started, the loop never stops.
// But this function is called to change tick functions.
// Avoid requesting multiple frames per frame.
var bindThis = this;
requestAnimationFrame(function() { bindThis.tick(); } );
this.lastTime = 0;
}
}
我不明白他为什么用这个
this.stop = function() {
this.run(null);
}
此函数将gameTick设置为null,从而中断了此.tick函数中的循环
this.tick = function () {
if (this.gameTick != null)
{
var bindThis = this;
requestAnimationFrame(function() { bindThis.tick(); } );
}
else
{
this.lastTime = 0;
return;
}
var timeNow = Date.now();
var elapsed = timeNow - this.lastTime;
if (elapsed > 0)
{
if (this.lastTime != 0)
{
if (elapsed > 1000) // Cap max elapsed time to 1 second to avoid death spiral
elapsed = 1000;
// Hackish fps smoothing
var smoothElapsed = (elapsed + this.prevElapsed + this.prevElapsed2)/3;
this.gameTick(0.001*smoothElapsed);
this.prevElapsed2 = this.prevElapsed;
this.prevElapsed = elapsed;
}
this.lastTime = timeNow;
}
}
}
这段代码的大部分是我不理解的,我可以看到他正在记录帧间经过的时间,但是其余的代码我都不知道了
他在网站上使用了术语singleton,用来防止程序尝试更新同一帧两次
我对javascript语法有一点经验,但我对singleton的概念以及该文件的一般目标/功能一无所知
为什么需要上面的代码而不仅仅是调用
requestAnimationFrame(函数(){}) 他之所以使用bindThis,是因为他正在将一个方法传递到下一行的匿名函数中。如果他只使用了
this.tick()
,this
将被定义为requestAnimationFrame
的上下文。他可以通过使用call
或apply
实现同样的目标
单例是只实例化一次的类。这是一个实践问题,而不是语法问题——javascript不知道什么是单例。通过将其称为“Singleton”,他只是在传达这样一个信息:这是一个只实例化一次的类,所有需要它的东西都将引用同一个实例 使用所有这些代码而不仅仅调用requestAnimationFrame的目的是什么?