0

感谢你们优秀的溢出者的帮助,我修复了我愚蠢的小 RNG 加法游戏并让它工作。现在,根据一位用户的建议,在编写下一个游戏之前,我正在尝试将添加游戏代码的范围从全局更改为本地;我希望每个游戏都完全包含在它自己的范围内,因为我知道学习不要轻率地污染全局范围是一个好主意。但是,我有点坚持如何实现这一目标。

这是当前功能加法游戏的代码:

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 中的选项与您的第二个片段相同。No wrap绑定到'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 回答