如何从全局访问隐藏在Object中的变量?

时间:2013-04-15 02:47:29

标签: javascript

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

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

她就是我的意思。

的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>

如何防止事物变为全局,但仍然可以调用隐藏对象的方法?这甚至可能吗?

2 个答案:

答案 0 :(得分: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);
})();

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

答案 1 :(得分:0)

更改

this.myNinja = new Ninja ("");

window.myNinja = new Ninja ("");