未捕获的TypeError:keyHandler不是函数

时间:2015-10-06 11:09:31

标签: javascript

我正在构建一个MVC风格的JavaScript游戏,但我遇到了一个问题。我需要在调用函数之前检查keyState是否为39,但是我收到以下错误:

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();
    });
};

1 个答案:

答案 0 :(得分:0)

在分配之前,您正在调用_self.keyHandler()三行。

你有这个块:

if(keyState[39] = true){
    _self.keyHandler();
};
在此之前

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

为了工作,必须采用相反的方式。

此外,正如Icepickle所指出的那样,keyState[39] = true是一项任务(因此始终为真),因此您可能希望将=替换为==

使用功能,您可以执行以下操作:

a();
function a(){}

因为函数声明被提升(移动到定义它们的作用域的顶部) 但对于属性,这不适用,并且由于this.keyHandler是属性,因此上述内容不适用,并且您收到错误。