鉴于以下课程:
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
。
有什么方法可以解决这个问题并允许我从执行的回调中访问类属性吗?
答案 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)}});