1

我一遍又一遍地读到全局变量和函数是不好的,必须不惜一切代价避免它们。但我一直无法做到这一点。我敢肯定这个问题已经被问过很多次了,我已经在 SO 上阅读过它们,但我仍然不完全理解。

我有一个对象,它有几个需要在特定事件上调用的方法(例如按钮单击)。我可以在匿名函数中隐藏所有内容,但是一旦这样做,我就不能再从外部调用对象内的方法。避免这种情况的唯一方法是将对象暴露给全局空间,以便它可以调用对象内的方法。

她的就是我的意思。

JavaScript

(function () { // using anonymous function to conceal variables/functions
    function Ninja (name) {
        this.name = name;

        this.hide = function () {
            alert("Find me if you can!");
        };

        this.kill = function (target) {
            alert(name + " killed " + target + ".");
        };
    }

    this.myNinja = new Ninja (""); // ... but I need to expose the object to global space
})();

HTML

<button onclick="myNinja.hide()">Click Me</button>

如何防止事情走向全球,但仍然能够调用定义隐藏对象的方法?这甚至可能吗?

4

2 回答 2

1

为了防止全球化你的对象,你应该在闭包内定义你的事件监听器:

(function () { // using anonymous function to conceal variables/functions
    // Ninja declaration
    var ninja = new Ninja('');

    document.getElementsByTagName('button')[0]
        .addEventListener('click', function() {
            ninja.hide();
        }, false);
})();

附加事件处理程序的确切方法因浏览器而异,这应该适用于大多数现代浏览器。

于 2013-04-15T03:51:22.287 回答
0

改变

this.myNinja = new Ninja ("");

window.myNinja = new Ninja ("");

于 2013-04-15T02:49:01.017 回答