有人可以向我解释这个Javascript Singleton代码吗?

时间:2014-03-07 20:06:23

标签: javascript singleton

此文件

http://www.iguanademos.com/Jare/docs/html5/Lessons/Lesson2/js/GameLoopManager.js

取自this site

以下是代码:

            // ----------------------------------------
            // 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;
                    }
                }

我不明白为什么他使用var bindThis = this

                this.stop = function() {
                    this.run(null);
                }

此函数将gameTick设置为null,打破this.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语法有一些经验,但单身的概念以及这个文件的一般目标/功能对我来说都没有了。


为什么需要上面的代码而不只是调用

requestAnimationFrame(function(){});

1 个答案:

答案 0 :(得分:0)

他使用bindThis的原因是他将一个方法传递给下一行的匿名函数。如果他只使用this.tick()this将被定义为requestAnimationFrame的上下文。他可以使用callapply来实现同样的目标。

单身人士只是一次实例化的课程。这是一个实践问题,而不是语法问题 - javascript不知道单身是什么。通过将其称为“Singleton”,他只是在传达这是一个仅实例化一次的类,并且需要它的所有内容都将引用相同的实例。