我有一个对象a
:
var a = {
b: {
f1: function(){console.log('in a.b.f1')}
},
c: {
_this: this,
f2: function(){this._this.b.f1()}
}
}
然后,我发现了错误TypeError: Cannot call method 'f1' of undefined
如何在a.b.f1()
中致电a.c.f2
?
答案 0 :(得分:3)
答案在于问题,请使用a.b.f1()
。
默认情况下,this
指的是拥有该功能的对象。如果函数是“空闲”,则this
引用全局window
对象。如果this
未包含在函数内,则它也会引用window
。
// "this" is window
function f() { /* "this" is "window" */ }
var o = {};
o.f = function () { /* "this" is "o" */ }
o.child = {};
o.child.f = function () { /* "this" is "o.child" */ }
了解这一点并考虑您的代码,我们可以说this
没有引用a
,因为它不包含在a
所拥有的函数中。要解决此问题,您只需将this
替换为a
:
var a = {};
a.b = {
f1: function () { console.log('in a.b.f1'); }
};
a.c = {
parent: a,
f2: function () { this.parent.b.f1(); }
};
请注意,您可以使用this
或call()
将apply()
“重定向”到另一个对象:
o.child.f.call(o); // "this" is now "o" inside of "o.child.f"