JavaScript SetInterval 的这个问题

JavaScript this issue with SetInterval

我试图每秒一遍又一遍地调用 class 中的一部分代码,

update() {
    for (let entity of this.entities) {
      if (entity instanceof Alien) {
        entity.y += 1;
        renderAliens(entity, this.context);
      }
    } 
  } 

这是我尝试在我的游戏对象中调用的代码 setInterval(newGame.update(),1000),但是当我尝试这样做时,它会出错,说 Uncaught TypeError: this.entities is undefined,我知道这是由于这个和 setinterval 的范围问题,但我不确定如何使用 bind 来解决这个问题

编辑:这里是整段相关代码

class Game {
  constructor() {
    this.gameOver = false;
    this.entities = [];
    this.context = document.getElementById("canvas").getContext("2d");
  }
  start() {
    this.entities.push(new Ship(0, 400));
    this.entities.push(new Alien(1, 0));
    this.entities.push(new Alien(20, 0));
    this.entities.push(new Alien(40, 0));
  }
  render() {
    for (let entity of this.entities) {
      if (entity instanceof Alien) {
        renderAliens(entity, this.context);
      } else if (entity instanceof Ship) {
        renderShip(entity, this.context);
      }
    }
  }
  update() {
    for (let entity of this.entities) {
      if (entity instanceof Alien) {
        entity.y += 20;
        renderAliens(entity, this.context);
      }
    }
  }

  endGame() {}
}

const newGame = new Game();
newGame.start();
newGame.render();
let t = setInterval(newGame.update, 1000);

您有两个选择:

  • 使用.bind()。这将 this 绑定到 newGame 实例
    setInterval(newGame.update.bind(newGame), 1000);
    
  • 定义一个回调函数:
    setInterval(function(){
      newGame.update();
    }, 1000);
    

把区间写成这样:

const intervalRef = setInterval(() => { newGame.update() }, 1000);

为什么不直接在构造函数中声明间隔?这样,您将避免任何上下文问题。

constructor() {
    this.gameOver = false;
    this.entities = [];
    this.context = document.getElementById("canvas").getContext("2d");
    setInterval(this.update.bind(this), 1000); // Here
  }