Typescript 更新方法中rightDown的作用域问题

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;

我在这里有一些奇怪的行为,在呈现的JS中,更新方法中的值是window,但它应该是Game(如onKeyDown方法)。你如何纠正这一点

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
绑定到其他东西,这将非常奇怪)。一个普遍的经验法则是,如果你从一个实例引用一个方法而没有立即调用它,你将有
这个
问题。很遗憾,编译器没有向我指出他的方法,即使我应该知道它。