2015-10-06 41 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

相关问题