0

クラスの定義のために次のコードがあります

var class1 = function () {
    this.classData = 'value1';
    this.func1 = function(callback) {
        $.ajax({
            'url': '/somewhere',
            'dataType': 'json',
            'type': 'POST',
            'data': {
                options: 'some text'
            },
            'success': function (data, textStatus, jqXHR) {
                callback(data); // <<<<<< THIS LINE
            }
        });
    };
};

そして、私はこのようにクラスを呼び出します

var obj1 = new class1();
obj1.func1(function (d) {
    this.classData = d;
});

ただし、sucess関数内で、上記のコードでマークされた行でコールバック関数が呼び出されると、値ではなく、をthis指すオブジェクトが含まれるため、これは機能しないようです。windowobj1

ここで何が間違っているのですか、どうすれば修正できますか?

4

1 に答える 1

1

これは実際にはスコープの問題ではなく、コンテキストの問題です。this、関数が呼び出されたときは、オブジェクトではなく、呼び出し時の関数の受信者ですobj1

これを行う :

var obj1 = new class1();
obj1.func1(function (d) {
    obj1.classData = d;
});

これは正しい方法です。

コールバックがすべて、class1のインスタンスをレシーバーとして持つことを意図している場合は、これを行うこともできます。

var class1 = function () {
    this.classData = 'value1';
    var _this = this;
    this.func1 = function(callback) {
        $.ajax({
            'url': '/somewhere',
            'dataType': 'json',
            'type': 'POST',
            'data': {
                options: 'some text'
            },
            'success': function (data, textStatus, jqXHR) {
                _this.callback(data); // note that I call the callback on the instance of obj1
            }
        });
    };
};
于 2012-10-13T14:22:52.223 に答える