JavaScript对象从另一个方法调用一个方法

时间:2012-10-13 14:29:40

标签: javascript jquery

鉴于以下对象文字,如何从c内调用b

更新1 - 错过了一件我使用JQuery加载的东西,它改变了上下文:

var a = {
    b: function (e) {

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

5 个答案:

答案 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,而当调用方法ba会指向其他代码。

我会做这样的事情:

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) { 
    }
};