4

这个问题最好用一些代码来解释,所以这里是:

// a class
function a_class {
    this.a_var      = null;
    this.a_function = a_class_a_function;
}

// a_class::a_function
function a_class_a_function() {
    AFunctionThatTakesACallback(function() {
        // How to access this.a_var?
    });
}

// An instance
var instance = new a_class();
instance.a_function();

从回调中AFunctionThatTakesACallback(),如何访问this.a_var

4

3 回答 3

7

您需要this通过创建引用它的局部变量来扩展范围,如下所示:

function a_class_a_function() {
   var self = this;
   AFunctionThatTakesACallback(function() {
      console.log(self.a_var); 
   });
}

您需要这样做的原因是因为函数this内的引用与当前对象不同,它可能会引用全局对象。(通常不是你想要的)。AFunctionThatTakesACallbackthiswindow

哦,我有没有提到这叫做闭包

于 2011-01-03T20:12:51.560 回答
0

当您调用时,instance.a_function()您实际上是在调用as ,因此您可以像这样进行修改:a_class_a_functioninstancethisa_class_a_function

function a_class_a_function() {
    var self = this;
    AFunctionThatTakesACallback(function() {
        // do something with self.a_var
    });
}

这里的问题是,如果您尝试调用a_class_a_function而不从实例调用它,那么this可能会引用全局对象window.

于 2011-01-03T20:12:59.670 回答
0

您可以尝试使用函数对象的call方法,它可以让您为此指定一个值:

myFunction.call(this, args...)

但我认为在这种情况下,将“this”作为参数之一传递给回调可能会更直接。

于 2011-01-03T20:11:53.703 回答