1

次のオブジェクト リテラルを指定すると、どのようにc内部から呼び出すことができますbか?

更新 1 - コンテキストを変更する JQuery ロードを使用することを 1 つ見逃しました。

var a = {
    b: function (e) {

        $o.load(path, function (e) { // need to call c from here });
    },
    c: function (e) { 
    }
};
4

5 に答える 5

4

a.c()内部でできるはずです.b

var a = {
    b: function(e) {
        a.c();
    },
    c: function(e) {}
};

a.b(); // calls c

また、次を使用してそのプロパティにアクセスできるようにするオブジェクトthisにバインドされます。athis.property

b: function(e) {
    this.c();
},
于 2012-10-13T14:31:29.693 に答える
2
var a = {
    b: function (e) {
        a.c();
    },

    c: function (e) {
        // magic goes here
    }
};

aクロージャーになるため、関数でアクセスできます (つまりa、各関数の狭い内側のスコープが継承する、広い外側のスコープで定義されます)。呼び出しコンテキストは関係ありません。クロージャーは、関数が定義されたときと場所で形成されるため、 の内部bでは、オブジェクトaは常に同じままです (this変化する可能性のある とは異なります)。

于 2012-10-13T14:31:55.793 に答える
2

これを試して:-

var a = {
b: function(e) {
    a.c();
},
c: function(e) {}
};

a.b(); 
于 2012-10-13T14:33:39.010 に答える
2

同じオブジェクト上にある限り、 メソッドからusingをb呼び出すことができます。ただし、渡される関数式については、それへのポインターをお勧めします。したがって、次のようにします。cthis.c$obindthisb

var a = {
    b: function (e) {
        $o.load(path, function (e) {
            this.c();
        }.bind(this));
    },
    c: function (e) {
    }
};

編集:このオブジェクトを作成して使用する方法は壊れやすいです。メソッドのthisバインドを解除したり、別のコンテキストで呼び出したりする場合など、ポインターは任意のものを指す場合があります。a.c他のコードが変更される可能性がaあり、メソッドbが呼び出されるaと別のものを指すため、使用しても絶対確実ではありません。

私はこのようなことをします:

var a = function (a) {
    a.b = function (e) {
        $o.load(path, function (e) {
            a.c();
        });
    };

    a.c = function (e) {
    };

    return a;
}({});

このコードは改ざんできず、プライベート変数とクロージャを作成できます。

于 2012-10-13T14:37:44.700 に答える
-1

最小限の変更を必要とする最も簡単なソリューションは、次を使用することjQuery.proxy()です。

var a = {
    b: function (e) {

        $o.load(path, $.proxy(function (e) { this.c(); }, this));
    },
    c: function (e) { 
    }
};
于 2012-10-13T15:19:33.010 に答える