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 に答える