如何从回调中访问此类成员?

Posted

技术标签:

【中文标题】如何从回调中访问此类成员?【英文标题】:How to get access to this class member from within a callback? 【发布时间】:2011-01-03 20:07:55 【问题描述】:

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

// 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

【问题讨论】:

【参考方案1】:

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

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

之所以需要这样做是因为AFunctionThatTakesACallback 函数中的this 引用与当前对象的this 不同,它可能会引用全局windowobject。 (通常不是你想要的)。

哦,我有没有提到这叫做closure

【讨论】:

完美。这很好用......你很好地解释了这个问题。 @George Edison 谢谢!我很感激! :)【参考方案2】:

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

myFunction.call(this, args...)

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

【讨论】:

【参考方案3】:

当您调用instance.a_function() 时,您实际上是在将instance 称为this 调用a_class_a_function,因此您可以像这样修改a_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

【讨论】:

以上是关于如何从回调中访问此类成员?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 成员函数作为外部库的回调函数

如何从 Kotlin 的内部类访问外部类的成员?

如何从类变量数组中访问类成员?

如何在本机回调中使用 Cython cdef 类成员方法

如何从组件属性访问类成员?

如何从派生类访问类的成员 - C++