次のオブジェクト リテラルを指定すると、どのようにc
内部から呼び出すことができますb
か?
更新 1 - コンテキストを変更する JQuery ロードを使用することを 1 つ見逃しました。
var a = {
b: function (e) {
$o.load(path, function (e) { // need to call c from here });
},
c: function (e) {
}
};
次のオブジェクト リテラルを指定すると、どのようにc
内部から呼び出すことができますb
か?
更新 1 - コンテキストを変更する JQuery ロードを使用することを 1 つ見逃しました。
var a = {
b: function (e) {
$o.load(path, function (e) { // need to call c from here });
},
c: function (e) {
}
};
a.c()
内部でできるはずです.b
:
var a = {
b: function(e) {
a.c();
},
c: function(e) {}
};
a.b(); // calls c
また、次を使用してそのプロパティにアクセスできるようにするオブジェクトthis
にバインドされます。a
this.property
b: function(e) {
this.c();
},
var a = {
b: function (e) {
a.c();
},
c: function (e) {
// magic goes here
}
};
a
クロージャーになるため、関数でアクセスできます (つまりa
、各関数の狭い内側のスコープが継承する、広い外側のスコープで定義されます)。呼び出しコンテキストは関係ありません。クロージャーは、関数が定義されたときと場所で形成されるため、 の内部b
では、オブジェクトa
は常に同じままです (this
変化する可能性のある とは異なります)。
これを試して:-
var a = {
b: function(e) {
a.c();
},
c: function(e) {}
};
a.b();
同じオブジェクト上にある限り、 メソッドからusingをb
呼び出すことができます。ただし、渡される関数式については、それへのポインターをお勧めします。したがって、次のようにします。c
this.c
$o
bind
this
b
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;
}({});
このコードは改ざんできず、プライベート変数とクロージャを作成できます。
最小限の変更を必要とする最も簡単なソリューションは、次を使用することjQuery.proxy()
です。
var a = {
b: function (e) {
$o.load(path, $.proxy(function (e) { this.c(); }, this));
},
c: function (e) {
}
};