0

素晴らしいオーバーフローアンの助けのおかげで、私はばかげた小さな RNG Addition ゲームを修正し、動作するようになりました。現在、あるユーザーの提案で、次のゲームをコーディングする前に、追加ゲームのコードのスコープをグローバルからローカルに変更しようとしています。グローバル スコープを軽率に汚染しないことを学ぶことが良い考えであることを理解しているため、各ゲームが独自のスコープ内に完全に含まれることを望んでいます。しかし、私はそれを達成する方法に少しこだわっています。

現在機能している足し算ゲームのコードは次のとおりです。

function beginAdditionChallenge() {
    var x = Math.ceil(Math.random()*100);
    alert(x);
    for (var i = 0; i < 3; i++) {
        var a = Number(prompt("Provide the first addend.", ""));
        var b = Number(prompt("Provide the second addend.", ""));
        if (a + b === x) {
            alert("Well done!");
            break;
        }
            else if (a + b !== x && i < 2) {
            alert("Please try again.");
        }
        else {
            alert("Derp.");
        }
    }
}

function initChallenge() {
    var button = document.getElementById("challengeButton");
    button.addEventListener("click", beginAdditionChallenge);
}

window.addEventListener("load", initChallenge);

ボタンが応答しないように、ゲームを中断するだけで成功します。

window.addEventListener("load", function() {
    function beginAdditionChallenge() {
        var x = Math.ceil(Math.random()*100);
        alert(x);
        for (var i = 0; i < 3; i++) {
            var a = Number(prompt("Provide the first addend.", ""));
            var b = Number(prompt("Provide the second addend.", ""));
            if (a + b === x) {
                alert("Well done!");
                break;
            }
                else if (a + b !== x && i < 2) {
                alert("Please try again.");
            }
                else {
                alert("Derp.");
            }
        }
    }

    function initChallenge() {
        var button = document.getElementById("challengeButton");
        button.addEventListener("click", beginAdditionChallenge);
    }

    window.addEventListener("load", initChallenge);
    });

機能コードは JSFiddleこちらで入手できます。

4

1 に答える 1

1

onLoadJSFiddleのオプションは、2 番目のスニペットと同じであることに注意してください。No wrap自分自身にバインドするときに、オプションの 1 つを選択する必要があり'load'ます。

また、この問題は、ハンドラー'load'内でバインドしようとすることに起因します。'load'

window.addEventListener("load", function() {
    // ...

    window.addEventListener("load", initChallenge);
});

イベントが既に発生し、外部バインディングを処理している場合、ハンドラーを追加するには遅すぎます。それらは繰り返されず、イベントが再び発生することはありません。

initChallenge外側のイベント バインディング内で呼び出すことができます。

window.addEventListener("load", function() {
    // ...

    initChallenge();
});

または、内部バインディングでIIFEを使用できます。

(function () {
    // ...

    window.addEventListener("load", initChallenge);
})();
于 2014-06-15T04:58:47.190 に答える