Skip to content Skip to sidebar Skip to footer

Property Of `this` Is Undefined Inside A Settimeout

class Simulator { constructor() { this.gates = Array(); this.gates.push(new AndGate(200, 200)); } initialize() { let canvas = document.getElementById('board');

Solution 1:

When functions are passed by reference, they lose their reference to this. You're losing this reference when calling setTimeout.

Functions have a bind() method that basically return a new function with a corrected reference to this.

Call it as such:

setTimeout(this.onLoop.bind(this), 1000)

Alternatively, you can also pass an in-line arrow function. Arrow functions don't lose their this context.

setTimeout(() =>this.onLoop(), 1000)

Solution 2:

When this.onLoop is called within the setTimeout, the calling context inside onLoop is window, because setTimeout is a function of the window object. You can fix that by using an arrow function that callsonLoop, rather than pass onLoop directly:

classSimulator {
  constructor() {
    this.gates = Array();
    //this.gates.push(new AndGate(200, 200));
  }
  initialize() {
    //let canvas = document.getElementById('board');//canvas.width = 800;//canvas.height = 500;//canvas.setAttribute("style", "border: 1px solid black");// this.gates.push(new AndGate(100, 100));this.gates.push({ render: () =>console.log('rendered') });
  }
  run() {
    setTimeout(() =>this.onLoop(), 1000);
  }
  onLoop() {
    for (let gate ofthis.gates) {
      gate.render();
    }
  }
}
let sim = newSimulator();
sim.initialize();
sim.run();

Or by binding the this context of the onLoop function to the instantiated object:

classSimulator {
  constructor() {
    this.gates = Array();
    //this.gates.push(new AndGate(200, 200));
  }
  initialize() {
    //let canvas = document.getElementById('board');//canvas.width = 800;//canvas.height = 500;//canvas.setAttribute("style", "border: 1px solid black");// this.gates.push(new AndGate(100, 100));this.gates.push({ render: () =>console.log('rendered') });
  }
  run() {
    setTimeout(this.onLoop.bind(this), 1000);
  }
  onLoop() {
    for (let gate ofthis.gates) {
      gate.render();
    }
  }
}
let sim = newSimulator();
sim.initialize();
sim.run();

Post a Comment for "Property Of `this` Is Undefined Inside A Settimeout"