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います...

では、このゲームは外部の無名関数でその状態を維持するのでしょうか? もしそうなら、なぜ彼らがそれをしたのか考えはありますか?

そして、loops呼び出しのたびに 0 に設定される例については、毎回変数を再宣言することを避けるために外部で宣言されていますか?

4

2 に答える 2

2

このタイプの構築は、即時起動関数式またはIIFEと呼ばれます。

このパターンは、スコープを管理するために使用されます。この場合、loopsやのような変数skipTicksがグローバル スコープに漏れるのを防いでいます。さらに重要なことは、それらは内部関数のクロージャーに引っかかるため、その内部関数の呼び出し間で存続します。IIFE を使用することで、内部関数のみがこの状態を確認でき、グローバル コンテキストから隠されます。

パターンに関する適切な記事を次に示します。特に、クロージャーによる状態の保存に関するセクションを参照してください。

于 2013-03-13T00:12:24.110 に答える
1

はい、そうなります。

local frame返された関数の は Game.run 関数の中にありlocal frameます。したがって、返された関数の前後で Game.run で変更された変数は永続的です。その関数の親フレームは、nextTick 変数を参照しようとするたびに Game.run 内を検索します。

于 2013-03-13T00:03:22.370 に答える