0

JS の変数スコープに頭を悩ませています。以下の例のようなオブジェクト ファクトリで作成されたオブジェクトのインスタンス変数にアクセスする方法はありますか?

function Renderer(id, options) {
    var id = id;
    var options = options;

    return {
        render: function(selector) {
            $(selector).each(function(index) {
                this.renderOptions(); //This does not reference the Renderer, but the html element selected by jQuery.
            });
        },
        renderOptions: function() {
            console.log(this.options);
        }
    }
}

var myRenderer = new Renderer('test', [1, 2, 3, 5, 8, 13]);
4

3 に答える 3

1

thisすべてのメソッド呼び出しで再定義され、通常はコールバック内の間違ったコンテキストを指しているため、オブジェクトへの名前付き参照を保持する必要があります。

var instance = {
    render: function(selector) {
        $(selector).each(function(index) {
            instance.renderOptions();
        });
    },
    ...
}
return instance;
于 2012-10-18T15:21:36.063 に答える
0

var options...は のスコープ内にあるため、関数内でRenderer簡単に使用できます。optionsrenderOptions

this他のポスターが言及したように、への参照も作成する必要があります。

function Renderer(id, options) {
    var id = id;
    var options = options;

    return {
        render: function(selector) {
            var self = this;
            $(selector).each(function(index) {
                self.renderOptions();
            });
        },
        renderOptions: function() {
            console.log(options);
        }
    }
}

renderOptionsそして、このコードの意図を正しく読んでいれば、要素への参照を関数に渡したいと思うでしょう:

function Renderer(id, options) {
    var id = id;
    var options = options;

    return {
        render: function(selector) {
            var self = this;
            $(selector).each(function(index) {
                self.renderOptions(this);
            });
        },
        renderOptions: function(ele) {
            $(ele).css(options); // or whatever you plan to do.
        }
    }
}
于 2012-10-18T15:38:28.143 に答える
0

変更されたコード

function Renderer(id, options) {
    var id = id;
    var options = options;

    return {
        render: function(selector) {
            var self = this;
            $(selector).each(function(index) {
                self.renderOptions();  // here this is a reference of dom element.
            });
        },
        renderOptions: function() {
            console.log(this.options);
        }
    }
}
于 2012-10-18T15:20:16.330 に答える