0

I have a function:

 interval(duration, fn) {
  var _this = this
  this.baseline = undefined
  
  this.run = function(){
    if(_this.baseline === undefined){
      _this.baseline = new Date().getTime()
    }
    fn()
    var end = new Date().getTime()
    _this.baseline += duration

    var nextTick = duration - (end - _this.baseline)
    if(nextTick<0){
      nextTick = 0
    }
    
    _this.timer = setTimeout(function(){
      _this.run(end)
    }, nextTick)
  }

  this.stop = function(){
    clearTimeout(_this.timer)
  }
}

Now when I invoke this function as such:

var timer = new this.interval(this.tempo, function(){
        this.audio.pause()
        this.playBackground()
      })

I need to somehow bind 'this' so that it is accessible so that I can call on this.audio.pause()

How do I bind this so I can access it?

etayluz
  • 15,920
  • 23
  • 106
  • 151
  • 1
    `fn()` -> `fn.call(this)` if you want to have the `this` in the callback regardless of where it comes from. `new this.interval(this.tempo, function(){` -> `new this.interval(this.tempo, () =>{` if you only want to define `time` within the class. – VLAZ May 09 '22 at 06:33
  • 3
    As a side-note - I wouldn't recommend using `var`. You seem to be using ES6 compatible code already, so there is no reason to avoid using `const` and `let`. – VLAZ May 09 '22 at 06:34
  • @VLAZ could you please write up the solution? I tried replacing `fn()` with `fn.call(this)` but it didn't work – etayluz May 09 '22 at 06:48
  • I see, it is supposed to be `fn.call( _this )` since you're aliasing `this` and you have an extra function. The duplicates cover in great detail everything you need to know about `this` and how it is determined at call time, as well as how to use it properly. – VLAZ May 09 '22 at 06:52

0 Answers0