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

Object undefined when declared before setInterval function

本文关键字:未定义 对象 声明 setInterval 函数      更新时间:2023-09-26

我是TypeScript的新手,来自Java,对JavaScript有一些了解。我正在学习TS通过制作一个好的老蛇游戏!

我有这个班桂,应该画画布。在我的构造函数中,我从创建Snake对象开始。稍后,我开始游戏循环,蛇应该在其中移动。。。

但是由于这个错误,循环函数不起作用"未捕获类型错误:无法读取未定义的属性'move'。"

我怀疑这与"异步"工作的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;
                }
            }
        }
    }
}

更改:

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

收件人:

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

当您直接传入函数时,this的值丢失了。