Учитывая следующий класс:
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
.
Есть ли способ исправить это и позволить мне получить доступ к свойствам класса из выполненного обратного вызова?
Обратный вызов вызывается без экземпляра 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)}});