当JavaScript对象文字嵌套时,这是什么?

时间:2014-03-01 08:30:01

标签: javascript

我有一个对象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

1 个答案:

答案 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(); }
};

请注意,您可以使用thiscall()apply()“重定向”到另一个对象:

o.child.f.call(o); // "this" is now "o" inside of "o.child.f"