Javascript Uncaught TypeError:undefined不是函数

时间:2014-11-30 17:50:35

标签: javascript exception phaser-framework

我正在尝试使用Phaser引擎制作一个简单的游戏,但我不断收到上述错误。

var mainState = {
...
playerJump: function(){
    yVelocity = -jumpPower;
},

spacePressed: function(){
    if(started)
    {
        return;
    }
    started = true;
    this.playerJump();
},      
...
updatePlayer: function(){
    if(player.body.x < game.world.centerX)
    {
        player.body.x += xVelocity;
    }

    player.body.y += yVelocity;
    yVelocity += gravity;

    if(player.body.y + player.body.height > floor)
    {
        this.playerJump();
    }
},

...}

如您所见,我已经定义了函数playerJump。您在样本中看到的所有变量都已正确定义并正常工作。当我从“updatePlayer”调用函数“playerJump”时,我没有得到任何错误。但是,如果我尝试从“spacePressed”调用它,我会得到“undefined不是函数异常。”

我使用的引擎是Phaser,我的所有代码都在一个文件中,如果这有任何区别的话。按下该键时,将从回调函数调用“spacePressed”函数。从游戏的主Update循环中调用“updatePlayer”。

你有什么想法可能会发生这种情况吗?当我从一个函数调用它而不是从另一个函数调用它时,为什么它可以工作?很高兴在必要时提供更多代码和详细信息。

2 个答案:

答案 0 :(得分:1)

当您使用对象方法作为事件处理程序或回调函数时, 将不再引用该对象。

解决此问题的最简单方法:

var mainState = { ... };
element.addEventListener(type, mainState.spacePressed.bind(mainState), false);

每个浏览器/版本可能都不支持此方法,因此您可以使用此方法:

var mainState = { ... };
element.addEventListener(type, function() {
    mainState.spacePressed.call(mainState);
}, false);

答案 1 :(得分:0)

我假设你已经创建了一个输入处理程序来检测是否按下空格。

这是检测鼠标单击按钮的代码(例如)。只需将“this”传递给第二个参数,以便回调将接收mainState上下文,以便稍后可以调用this.playerJump()

spaceButton.events.onInputDown.add(this.spacePressed,this)

当您在this.playerJump()方法中调用spacePressed()时,

将解决您的问题。