0

この質問に関連して、データを取り戻すためにコールバックを追加しようとしています。だから私はこれを試しました:

var subgroupIds = [];
var that = this;
this.getSubGroups = function (groupId,callback) {
    var anotherObject = this;
    this.getGroups("groupId="+groupId, function(groups) {
        if ($.isEmptyObject(groups)) {
            return;
        } else {
            $.each(groups, function(index,group) {
                subgroupIds.push(group.id);
                that.getSubGroups(group.id);
            });
            anotherObject.callback(group.id);
        }
     });
}

前の質問の後、クロージャについてよく理解していると思いましたが、理解していないと思います...次のエラーが発生します。

Uncaught TypeError: Object [object Window] has no method 'callback'

私はここで何が間違っているのですか?

編集

getGroupsの内容は次のとおりです。

this.getGroups = function(filter,callback,error_callback) {
    this.getJSON('/'+apiVersion+'/groups/',function(data){
        // run through the filter engine
        output = runFilter(data, filter);
        callback(output);
    },error_callback);
}
4

2 に答える 2

1

である必要はありません。必要anotherObject.callback(group.id);なのはcallback(group.id);

オブジェクトと混同thisしているようです。arguments

arguments関数に渡されるすべてのパラメーターを保持します。

var aFunction = function () {
    for (var i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);
    }
};

aFunction(1, 2, 3, 4); // 1, 2, 3, 4

基本的には関数の「所有者」をthis指します(大まかに言えば、ドットの前にあるものは何でも):

var aFunction = function () {
    console.log(this);
};

var object1 = { f: aFunction, name: "object1" };
var object2 = { f: aFunction, name: "object2" };

object1.f(); // Object { name="object1", f=function()}
object2.f(); // Object { name="object2", f=function()}
aFunction(); // Window
于 2013-02-28T14:48:31.587 に答える
0

コールバックはパラメーターであり、コンテキストにバインドされていません。

あなたが望むのは、コールバックを値として呼び出すことだと思いますよanotherObjectthis

あなたはそれを達成することができます:

$.proxy(callback, anotherObject)(group.id);

または、コールバックのみを実行し、クロージャーを使用する場合は、次を追加する必要があります。

this.callback = callback; //before
var anotherObject = this;
于 2013-02-28T14:40:25.517 に答える