鉴于以下对象文字,如何从c
内调用b
?
更新1 - 错过了一件我使用JQuery加载的东西,它改变了上下文:
var a = {
b: function (e) {
$o.load(path, function (e) { // need to call c from here });
},
c: function (e) {
}
};
答案 0 :(得分:3)
您应该可以在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();
},
答案 1 :(得分:2)
var a = {
b: function (e) {
a.c();
},
c: function (e) {
// magic goes here
}
};
a
将是一个闭包,因此它可以在函数中访问(即,a
在一个宽的外部范围中定义,每个函数中较窄的内部范围继承)。呼叫上下文无关紧要;在定义函数的时间和位置形成闭包,因此在b
内,对象a
将始终保持不变(与this
不同,后者可以更改)。
答案 2 :(得分:2)
试试这个: -
var a = {
b: function(e) {
a.c();
},
c: function(e) {}
};
a.b();
答案 3 :(得分:2)
从方法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;
}({});
此代码无法被篡改,并允许您创建私有变量和闭包。
答案 4 :(得分:-1)
需要最少更改的最简单的解决方案是使用jQuery.proxy()
:
var a = {
b: function (e) {
$o.load(path, $.proxy(function (e) { this.c(); }, this));
},
c: function (e) {
}
};