2015-10-06 40 views
0

我正在構建一個MVC風格的JavaScript遊戲,並且遇到了問題。我需要檢查,如果keyState是39調用一個函數之前,但我發現了以下錯誤:未捕獲TypeError:keyHandler不是函數

Uncaught TypeError: _self.keyHandler is not a function 

任何人可以幫助我嗎?問題是與下面的代碼:

if(keyState[39] = true){ 
     _self.keyHandler(); 
    }; 

全碼:

GOBLINS.Controller.prototype.input = function() { 

     var _self = this; 
     var keyState = {}; 

    window.addEventListener('keydown', function(e){ 
     if(e.keyCode === 39){ // Move Right 
      keyState[e.keyCode] = true; 
     }; 
     if(e.keyCode === 37){ // Move Left 
      keyState[e.keyCode] = true; 
     }; 
     if(e.keyCode === 38){ // Move Up 
      keyState[e.keyCode] = true; 
     }; 
     if(e.keyCode === 40){ // Move Down 
      keyState[e.keyCode] = true; 
     }; 
    }, true); 

    window.addEventListener('keyup', function(e){ 
     if(e.keyCode == 39){ 
      keyState[e.keyCode] = false; 
     }; 
     if(e.keyCode == 37){ 
      keyState[e.keyCode] = false; 
     }; 
     if(e.keyCode == 38){ 
      keyState[e.keyCode] = false; 
     }; 
     if(e.keyCode == 40){ 
      keyState[e.keyCode] = false; 
     }; 
    }, true); 

     if(keyState[39] = true){ 
      _self.keyHandler(); 
     }; 

    this.keyHandler = function(){ 
     if(keyState[39] === true){ 
      this.M.images[2].moveRight(); 
      console.log(this.M.images[2]); 
      }; 
     if(keyState[37] === true){ 
      this.M.images[2].moveLeft(); 
      }; 
     if(keyState[38] === true){ 
      this.M.images[2].moveUp(); 
      }; 
     if(keyState[40] === true){ 
      this.M.images[2].moveDown(); 
     }; 
    }; 

    window.requestAnimationFrame(function(){ 
     _self.input(); 
    }); 
}; 
+0

@SHAZ,請不要將無意義的格式添加到帖子中,以繞過6個字符的規則。它的確如此,以至於你對帖子的改進不會太大。今後,請在這篇文章中找到一些有意義的*來改進,並建議。否則,請不要建議編輯。 –

+0

實際上你是按照你寫的方式分配true的keyState [39] – Icepickle

+0

這個原型是如何與你的UI連接的,換句話說,它是什麼時候啓動的?它是什麼時候被調用的? – Icepickle

回答

0

分配之前,您所呼叫_self.keyHandler()三行。

您有該程序:

if(keyState[39] = true){ 
    _self.keyHandler(); 
}; 

此人之前:

this.keyHandler = function(){ 
    // ... 
} 

當它必須是倒過來才能工作。

此外,作爲Icepickle指出,keyState[39] = true是一個賦值(因此總是如此),所以你可能想通過===更換。

有了你可以做以下功能:

a(); 
function a(){} 

因爲函數聲明高掛(移動到它們所定義的範圍的頂部)。
但是,對於屬性,這不適用,並且因爲this.keyHandler是一個屬性,所以以上不適用,並且您會收到錯誤。

+0

不是keyState [39] =真的是一個賦值而不是測試,如果它是真的;) – Icepickle

+0

你有沒有聽說過吊裝? –

+0

@MadaraUchiha對於**功能**是的,但對於**屬性**?你是否說下面的代碼應該工作? 'function derp(){this.meow(); this.meow = function(){console.log('meow');};} var a = new derp();'因爲它給我一個錯誤。 – Siguza

相關問題