2015-04-01 74 views
0

我是新來的TypeScript,來自Java並具有JavaScript的一些知識。我正在通過製作一個很好的老蛇遊戲來學習TS!對象在setInterval函數之前聲明時未定義

我有這個班應該畫畫布的桂。在我的構造器中,我開始創建我的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; 
       } 
      } 
     } 

    } 

} 
+0

哦,可怕的「這在回調」問題.....!我在setInterval Mozilla文檔中找到了這個描述:https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval。 我結束了使用箭頭語法(ES6)。它做到了! this.loop = setInterval(()=> this.gameLoop(),this.loopSpeed); – olefrank 2015-04-01 15:45:52

回答

2

變化:

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

要:

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

this的價值,當你在函數直接傳遞是迷路。