Javascript未捕获的TypeError错误:未定义的函数。

3
我正在尝试使用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 中调用它,则会出现“未定义的函数异常”。我的引擎是 Phaser,而且我的所有代码都在一个文件中,如果这有什么区别的话。当按下键盘键时,回调函数会调用“spacePressed”。在游戏的主更新循环中调用“updatePlayer”。您有什么想法可能会发生这种情况吗?为什么在从一个函数调用它时可以工作,但从另一个函数中却不能工作?如有必要,我很乐意提供更多代码和详细信息。

如果您在JSFiddle上重现了您的问题,那么或许我们可以帮助您。 - Givi
1
你的 "spacePressed" 函数可能是从事件处理程序中调用的,而 this 的值并不是你所认为的。 - Pointy
是的,我的spacePressed实际上是从事件处理程序调用的。在这种情况下,我该如何访问该函数? - Valentin Baltadzhiev
尝试使用mainState.updatePlayer(),如果updatePlayer函数是在按钮单击时调用的,则“this”对象将引用所单击的按钮。 - Dawood Awan
2个回答

1
当您将对象方法用作事件处理程序或回调函数时,this将不再引用该对象。
解决此问题的最简单方法是:
var mainState = { ... };
element.addEventListener(type, mainState.spacePressed.bind(mainState), false);

这种方法可能并不适用于每个浏览器/版本,所以您可以使用以下方法代替:
var mainState = { ... };
element.addEventListener(type, function() {
    mainState.spacePressed.call(mainState);
}, false);

0

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

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

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

当你在spacePressed()方法中调用this.playerJump()时,将解决你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接