【问题标题】:Javascript Uncaught TypeError: undefined is not a functionJavascript Uncaught TypeError:未定义不是函数
【发布时间】:2014-11-30 17:50:34
【问题描述】:

我正在尝试使用 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 中重现您的问题,也许我们可以帮助您。
  • 您的“spacePressed”函数可能是从事件处理程序中调用的,this 的值不是您想的那样。
  • 是的,我的 spacePressed 实际上是从事件处理程序中调用的。在这种情况下如何访问该功能?
  • 试试mainState.updatePlayer(),如果updatePlayer函数在按钮上被调用点击'this'对象是指被点击的按钮

标签: javascript exception phaser-framework


【解决方案1】:

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

解决这个问题的最简单方法:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2012-10-23
      • 2016-01-14
      • 2015-08-04
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多