5

javascriptライブラリを作成したいので、スコープの安全性とすべてを確保するために、すぐに自己実行する関数にするのは良いことだと思いました。

しかし、今はよくわからない「this」キーワードの使用で問題が発生しています。

このようなコードを正しく機能させるにはどうすればよいですか?現在、「画像」は未定義であるとのことです。

(function() {

    function lib() {
        this.image = document.getElementById("image");
        this.parts = [
            {name: "part1", num: "1"}
        ];

        this.init = function() {
            $(parts).each(function() {
                var partNum = this.num;
                image.getElementById(partNum).addEventListener("click", function() {
                    toggleHighlight(partNum);
                }, true);
            });
        };
    }

    window.lib = new lib();
})();

window.lib.init();

どうすればimage宿泊施設にアクセスできますか?

4

3 に答える 3

2

ここにいくつかの問題があると思います:

  • のプロパティとしてアクセスせずに、関数で参照partsしています。initthis
  • ブロック内では、グローバル変数としてeachアクセスしていますが、グローバルに宣言されていません。そのコンテキストでは、実際に反復しているアイテムに設定されているため、そのブロックからアクセスimageすることはできません。(そのため、 にアクセスできます。)imagethisthisthis.num

var that = this; を含めることをお勧めします。init 関数の前に置き、that.image のようなプロパティにアクセスするときに使用します。

var that = this;
this.init = function() {
    $(this.parts).each(function() {
        var partNum = this.num;
        that.image.getElementById(partNum).addEventListener("click", function() {
            toggleHighlight(partNum);
        }, true);
    });
};
于 2011-05-26T13:31:05.850 に答える
1

私があなたの権利を理解しているなら、あなたはあなたがに提供する無名関数から関数this.image内で定義されたプロパティへのアクセスを取得したいと思っています。これを行うには、無名関数で使用できるように保存する必要があります。libeachthis

this.init = function() {
    var self = this;
    $(parts).each(function() {
        //do something with self.image
        self.image;
    });
};
于 2011-05-26T13:27:02.633 に答える
0

関数名の最初の文字も大文字にする必要があります。これは、キーワードlibを使用してコンストラクターとして使用されることが予想されるためです。JavaScript のコンストラクターの命名規則newについて、Javascript The Good Parts の著者が述べていることをご覧ください。

于 2011-05-26T13:39:56.890 に答える