1

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

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

var a = {
    b: function (e) {

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

5 回答 5

4

你应该可以在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();
},
于 2012-10-13T14:31:29.693 回答
2

只要它们在同一个对象上,您就可以使用该方法b调用它们。但是,对于传递给的函数表达式,我建议您使用指向它的指针。因此,您可以:cthis.c$obindthisb

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

此代码不能被篡改,并允许您创建私有变量和闭包。

于 2012-10-13T14:37:44.700 回答
2
var a = {
    b: function (e) {
        a.c();
    },

    c: function (e) {
        // magic goes here
    }
};

a将是一个闭包,因此它可以在函数中访问(也就是说,a定义在一个宽的外部范围内,每个函数中的较窄的内部范围都继承了该范围)。调用上下文无关;闭包是在定义函数的时间和地点形成的,因此在内部b,对象a将始终保持不变(不像this,它可以改变)。

于 2012-10-13T14:31:55.793 回答
2

尝试这个:-

var a = {
b: function(e) {
    a.c();
},
c: function(e) {}
};

a.b(); 
于 2012-10-13T14:33:39.010 回答
-1

需要最少更改的最简单的解决方案是使用jQuery.proxy()

var a = {
    b: function (e) {

        $o.load(path, $.proxy(function (e) { this.c(); }, this));
    },
    c: function (e) { 
    }
};
于 2012-10-13T15:19:33.010 回答