Javascript游戏循环状态在匿名函数中

时间:2013-03-12 23:57:19

标签: javascript scope html5-canvas anonymous-function

我正在搞乱画布,首先阅读一堆游戏循环片段/帖子并将它们组合成最好的一个。

我今天遇到了这个片段(它是a post的一部分,所以他们稍后会对它进行进一步的迭代。但是我正在整合这些想法),但这让我感到困惑。

Game.run = (
    function() {
        var loops = 0;
        var skipTicks = 1000 / Game.fps;
        var maxFrameSkip = 10;
        var nextGameTick = (new Date).getTime();

        return function {
            loops = 0;

            while ((new Date).getTime() > nextGameTick && loops < maxFrameSkip) {
                Game.update();
                nextGameTick += skipTicks;
                loops++;
            }

            Game.draw();
        };
    }
)();

Game._intervalId = setInterval(Game.run, 1000 / Game.fps);

因此Game.run被赋予外部函数的结果,这是内部函数。但是内部函数依赖于nextGameTick,它在外部函数中定义...

这个游戏会保持其在外部匿名功能中的状态吗?如果是这样,任何想法为什么他们这样做?

至于例如loops,每次调用都设置为0,是否在外部声明,以避免每次重新声明变量?

2 个答案:

答案 0 :(得分:2)

这种类型的构造称为立即调用的函数表达式 IIFE

此模式用于管理范围。在这种情况下,我们阻止loopsskipTicks等变量泄漏到全局范围。更重要的是,它们在内部函数的闭包中被捕获,因此在对内部函数的调用中持续存在。通过使用IIFE,只有我们的内部函数可以看到这种状态,并且它在全局环境中是隐藏的。

这是模式上的decent article。请特别参阅有关使用闭包保存状态的部分。

答案 1 :(得分:1)

是的。

您返回的函数的local frame位于Game.run函数的local frame内。因此,围绕您返回的函数在Game.run中更改的任何变量都是持久的。只要您尝试引用nextTick变量,该函数的父框架就会在Game.run中查找。