Typescript 更新方法中rightDown的作用域问题
我在这里有一些奇怪的行为,在呈现的JS中,更新方法中的值是window,但它应该是Game(如onKeyDown方法)。你如何纠正这一点Typescript 更新方法中rightDown的作用域问题,typescript,Typescript,我在这里有一些奇怪的行为,在呈现的JS中,更新方法中的值是window,但它应该是Game(如onKeyDown方法)。你如何纠正这一点 class Game { //for the key events rightDown: bool = false; constructor() { } onKeyDown(evt) { if (evt.keyCode == 39) this.rightDown = true;
class Game {
//for the key events
rightDown: bool = false;
constructor() {
}
onKeyDown(evt) {
if (evt.keyCode == 39) this.rightDown = true;
else if (evt.keyCode == 37) this.leftDown = true;
if (evt.keyCode == 32) {
this.space = true;
var bullet = new GameObjects.GameObjects.Bullet(10);
this.addProjectile(bullet);
};
}
update(elapsed: number) {
if (this.rightDown) {
console.log(this.rightDown);
}
}
你在别的地方写了这样的东西:
setupAnimationTimer(myGame.update); // Maybe window.requestAnimationFrame ?
请注意,您只是从Game
的原型传递update
——没有指向实际myGame
实例的指针,因此执行回调的人无法使用正确的this
指针正确调用update
方法
如果你四处搜索,就会有很多关于这个绑定是如何丢失或保留的博客帖子;以下是两种可能的解决方案:
// Create a new closure
setupAnimationTimer(() => myGame.update());
或
你在别的地方写了这样的东西:
setupAnimationTimer(myGame.update); // Maybe window.requestAnimationFrame ?
请注意,您只是从Game
的原型传递update
——没有指向实际myGame
实例的指针,因此执行回调的人无法使用正确的this
指针正确调用update
方法
如果你四处搜索,就会有很多关于这个绑定是如何丢失或保留的博客帖子;以下是两种可能的解决方案:
// Create a new closure
setupAnimationTimer(() => myGame.update());
或
这是因为您将给出一个回调,然后调用实例之外的update方法。只要您从实例本身调用函数,this
指针就将是正确的(除非它被bind
绑定到其他东西,这将非常奇怪)。一般的经验法则是,如果您引用实例中的方法而不立即调用它,您将遇到此问题。遗憾的是,编译器没有向我指出他的方法,即使我应该知道。这是有效的,因为您给出了一个回调,然后从实例中调用update方法。只要您从实例本身调用函数,this
指针就将是正确的(除非它被bind
绑定到其他东西,这将非常奇怪)。一个普遍的经验法则是,如果你从一个实例引用一个方法而没有立即调用它,你将有这个问题。很遗憾,编译器没有向我指出他的方法,即使我应该知道它。