如何访问闭包父对象的方法?

时间:2010-06-14 08:27:31

标签: javascript closures

我已经定义了一个名为MyClass的类,我为它定义了两个方法myMethod1myMethod2

function MyClass() {}
MyClass.prototype.myMethod1 = function() {...};
MyClass.prototype.myMethod2 = function() {...};

myMethod1内部,我使用jQuery,并在那里定义了一个回调闭包:

MyClass.prototype.myMethod2 = function() {
 $.jQuery({success: function(data) {
  this.myMethod2();
 }, ...});
}

现在问题是this不再指代MyClass。问题是我怎么能参考它?目前我已将其分配给名为thisObj的变量并以这种方式访问​​它:

MyClass.prototype.myMethod2 = function() {
 var thisObj = this;
 $.jQuery({success: function(data) {
  thisObj.myMethod2();
 }, ...});
}

是否有更好的方法可以从嵌套在MyClass.this的闭包中访问myMethod2

提前致谢。

3 个答案:

答案 0 :(得分:1)

你的解决方案非常好。既然你已经有一个封闭,也可以使用它,这绝对没问题。

但如果您愿意,可以改为使用jQuery.proxy,如下所示:

MyClass.prototype.myMethod2 = function() {

    $.jQuery({success: jQuery.proxy(function(data) {
        this.myMethod2();
    }, this), ...});
}

但是,您的原始解决方案并没有错。但是,当你想在许多不同的地方重用一个函数,或者当你还没有一个闭包并且不想引入一个函数时(或许因为它会关闭),使用proxy可能会有所帮助很多不相关的东西)。关于proxy的好处是,它会在一组受控制的东西上创建一个闭包,而不是在当前范围内。

答案 1 :(得分:1)

您可以将此引用传递给该函数,但您的解决方案似乎对我来说很好。你只是使用Javascript的词法作用域规则,那有什么不对?

答案 2 :(得分:1)

您使用的方法通常称为“该引用”,因为名称that通常用作this引用副本的名称。例如,请参阅Crockford关于JavaScript的讨论。