0

require()関数のsuccessリスナー内からfoo.settings.debugオブジェクトにアクセスしたいと思います。未定義のエラーが発生し続け、「this」を参照すると、ajaxオブジェクトを参照することになります。手伝ってください。

var foo = {

    info: {

        version: '0.0.1'

    },

    settings: {

        debug: true

    },

    require: function(script) {

        $.ajax({
            url: script,
            dataType: "script",
            async: false,
            success: function(){
                if(foo.settings.debug) console.log('loaded js file: ' + script);
            },
            error: function(){
                throw new Error("Could not load script " + script);
            }
        });

    }
}
4

2 に答える 2

1

すべての関数には、独自のthisオブジェクトコンテキストがあります。コンテキストは、applyまたは他のそのような関数を使用して変更できます。

この場合、成功のコールバックとして無名関数を作成することにより、新しいコンテキストを入力しています。前のコンテキストにアクセスするには、前のコンテキスト内で変数を定義する必要があります(コールバック関数の引数名によってオーバーライドされない名前で)。

var foo = {

    info: {

        version: '0.0.1'

    },

    settings: {

        debug: true

    },

    require: function(script) {
        /* every function has its own 'this' context */
        var self = this;

        $.ajax({
            url: script,
            dataType: "script",
            async: false,
            success: function(){
                if(self.settings.debug) console.log('loaded js file: ' + script);
            },
            error: function(){
                throw new Error("Could not load script " + script);
            }
        });

    }
}
于 2012-11-21T20:14:36.187 に答える
1

thisfooの内部にあるfooへの参照がthis必要ですが、クロージャーの内部では別の何かになるため、次のthisように参照を保持する必要があります。

require: function(script) {
        var self = this;
        $.ajax({
            url: script,
            dataType: "script",
            async: false,
            success: function(){
                if(self.settings.debug) console.log('loaded js file: ' + script);
            },
            error: function(){
                throw new Error("Could not load script " + script);
            }
        });

    }
于 2012-11-21T20:16:33.233 に答える