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
}
我试图每秒一遍又一遍地调用 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
}