1

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

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

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外部函数中定义的...

那么这个游戏会在外部匿名函数中保持其状态吗?如果是这样,有什么想法他们为什么这样做?

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

4

2 回答 2

2

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

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

这是一篇关于模式的不错的文章。请特别参阅关于使用闭包保存状态的部分。

于 2013-03-13T00:12:24.110 回答
1

是的,它会。

local frame您返回的函数位于local frameGame.run 函数的内部。因此,在 Game.run 中围绕您返回的函数更改的任何变量都是持久的。每当您尝试引用 nextTick 变量时,该函数的父框架将在 Game.run 内部查看。

于 2013-03-13T00:03:22.370 回答