TypeError:undefined不是函数(Phaser JS)

时间:2015-01-03 22:18:02

标签: javascript phaser-framework

大家好我只是在课堂上尝试执行一个方法而且它不起作用。 我得到了一个" Uncaught TypeError:undefined不是一个函数"错误。

我称其他功能为好,而且运作良好,所以我不明白。我试图更改名称,没有任何内容。

我认为我使用Phaser存在问题,但我不知道......

Bomb.prototype.collisionBlocs = function() {
    if (!this.hasBounced) {
        this.bounce();
        this.hasBounced = true;
    }
}

Bomb.prototype.bounce = function() {       
    if (this.direction == 'UP') {
        this.direction = 'DOWN';
    }
    else if (this.direction == 'RIGHT') {
        this.direction = 'LEFT';
    }
    else if (this.direction == 'DOWN') {
        this.direction = 'UP';
    }
    else if (this.direction == 'LEFT') {
        this.direction = 'RIGHT';
    }
}

2 个答案:

答案 0 :(得分:5)

  

“事实上,collisionBlocs()是来自移相器碰撞事件的回调函数:game.physics.arcade.collide(this.sprite, blocs, this.collisionBlocs);也许这就是问题”

成为问题。在JS中,函数中this的值取决于函数的调用方式。您将对collisionBlocs的引用传递给.collide()方法,当它调用它时,它将无法正确设置this,因此this.bounce将为undefined

您需要强制this的值正确。最简单的方法是使用.bind()

game.physics.arcade.collide(this.sprite, blocs, this.collisionBlocs.bind(this));

旧浏览器不支持.bind() method(IE <= 8),但如果您需要支持这些浏览器,则可以使用a polyfill

MDN有关于how this works in JavaScript的更多信息。

答案 1 :(得分:2)

不是绑定this,而是使用callbackContext为您提供的collide参数会更容易。它是专门为此问题添加的。这是方法签名:

collide: function (object1, object2, collideCallback, processCallback, callbackContext)

您没有使用processCallback,因此您可以为此传递null,但您确实需要上下文。这是调用回调的上下文(尝试this开始)。