如何在回调中引用类的属性

时间:2017-06-09 00:55:07

标签: javascript

鉴于以下课程:

class TimerFunk {
    constructor(someObject){
        this.a = 1
        this.someObject = someObject
    }
    funk(){
        console.log(this.a)
        if(this.a > 2){
            return
        }
        this.a++
        this.someObject.execCallback(this.funk)
    }
}

执行以下命令时:

t = new TimerFunk({execCallback:function(callback){callback()}})
t.funk()

意图在TimerFunk.a之前将属性this.a>2记录到控制台。但是,循环只执行一次:

VM2097:9 1
VM2097:9 Uncaught TypeError: Cannot read property 'a' of undefined
    at funk (<anonymous>:9:25)
    at Object.execCallback (<anonymous>:5:13)
    at TimerFunk.funk (<anonymous>:13:25)
    at <anonymous>:1:3

从调试我发现这是因为在第一个循环this代表对象t但是,在第二个循环this代表someObject

有什么方法可以解决这个问题并允许我从执行的回调中访问类属性吗?

1 个答案:

答案 0 :(得分:2)

在没有TimerFunk实例t作为this对象的情况下调用您的回调:

function(callback){callback()}}

解决方案是将回调的this对象绑定到TimerFunk实例:

funk() {
  ...
  this.someObject.execCallback(this.funk.bind(this));
}

或者,您可以通过t明确地将this作为callback.call(t)对象传递:

t = new TimerFunk({execCallback:function(callback){callback.call(t)}});