有人能给我解释一下这个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的目的是什么?