Как ссылаться на свойства класса из обратного вызова [duplicate]

1

Учитывая следующий класс:

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 ответ

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)}});
  • 0
    Интуитивно я бы предположил, что this.funk.bind (this) не вернул бы funk. Очень рад, что эта функциональность существует, хотя я хотел избежать передачи аргумента t, если это возможно! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню