在setInterval函数之前声明时,对象未定义

时间:2015-04-01 15:30:48

标签: javascript typescript

我是TypeScript的新手,来自Java并且拥有一些JavaScript知识。我通过制作一个很好的老蛇游戏来学习TS!

我有这个类Gui应画画布。在我的构造函数中,我开始创建我的Snake对象。后来我开始游戏循环,其中应该移动Snake ......

但由于此错误,循环功能不起作用。 “未捕获类型错误:无法读取未定义的属性'移动'。”

我怀疑它与setInterval函数有关,该函数可以“异步”或者其他东西,但我不确定......这似乎是一种基本的JavaScript问题。

非常感谢任何帮助!

module gui {

    export class Gui {
        snake:model.Snake;
        loop:any;

        constructor() {
            // get snake
            this.snake = new model.Snake();

            // Attach key event
            document.addEventListener("keydown", KeyListener.handleEvt);

            // activate game loop
            this.loop = setInterval(this.gameLoop, 50);
        }

        gameLoop() {
            if (this.snake) {
                console.log("loop");
                this.snake.move();
                this.drawSnake()
            }
        }

        drawPart(part:model.Part) { ... }

        drawSnake() { ... }

    }

    class KeyListener {

        static handleEvt(e) {
            if (e) {
                switch (e.keyCode) {
                    case 37:
                        console.log("left");
                        break;
                    case 38:
                        console.log("up");
                        break;
                    case 39:
                        console.log("right");
                        break;
                    case 40:
                        console.log("down");
                        break;
                }
            }
        }

    }

}

1 个答案:

答案 0 :(得分:2)

变化:

this.loop = setInterval(this.gameLoop, this.loopSpeed);

要:

this.loop = setInterval(() => this.gameLoop(), this.loopSpeed);

当您直接传递函数时,this的值会丢失。