Javascript:uncaught typeerror undefined不是对象方法的函数

时间:2014-06-02 09:34:42

标签: javascript javascript-objects phaser-framework

我做了一个简单的问答游戏。这是我在一个对象中的一些相关方法。

但是不起作用。我总是在'rightAnswerGot'功能中出错。控制台掉线 “uncaught typeerror undefined不是对象方法的函数”for this.addVariantsHtml(this.updateCharacter());

BasicGame.Game.prototype = {


    actionOnClick: function (button) {
    var log;
    if(button.value==this.char_bubble.text) {

        setTimeout(this.rightAnswerGot,1000);

    } else {
        // wrong

              swoshsound.play();

    }
    console.log(log);
},

 rightAnswerGot: function (){

        this.addVariantsHtml(this.updateCharacter());


    },

 addVariantsHtml: function(id) {

    this.answer = this.getAnswersVariants(id);

    for (var i = 0; i < 6; i++) {
        this.button[i].value = this.answer[i]['trans'];
        this.button[i].char_id = this.answer[i]['id'];
        this.ans_text[i].setText(this.answer[i]['trans']);

    }
},

updateCharacter: function() {
        var i = this.getRandomCharacter();
        console.log("updateCharacter: "+i + " " +this.chars[i]);

        this.char_bubble.setText(this.chars[i].getPath());
        return i;
    }

}

当用户选择正确的答案时,目的是冻结游戏一秒钟,然后转到下一个问题。任何想法为什么会发生?

由于

3 个答案:

答案 0 :(得分:2)

对我来说,这似乎是一个经典的JavaScript范围问题。但是,由于您已将此问题标记为使用Phaser,我建议您使用Phaser Timer事件来避免范围问题。具体做法是:

setTimeout(this.rightAnswerGot,1000);

将其替换为:

this.game.time.events.add(Phaser.Timer.SECOND, this.rightAnswerGot, this);

这将创建一个仅触发一次的1秒计时器,在其末尾调用您的函数。当然,您可以使用1000而不是Phaser.Timer.SECOND。

答案 1 :(得分:0)

我想知道发生的事情是它试图调用this.addVariantsHtml方法,然后调用this.updateCharacter并获取ID。

所以你可能期望它在运行时,它就像是:

this.addVariantsHtml(1);

但它实际上试图运行

this.addVariantsHtml(this.updateCharacter());

所以就这样做:

var id = this.updateCharacter();
this.addVariantsHtml(id);

或者你需要研究方法链接/管道,这很复杂,不需要用于这种情况,但很有趣:)

答案 2 :(得分:0)

好的,我发现了一些让它起作用的东西!!

这是一个解决方案:

 actionOnClick: function (button) {
    var log;
    if(button.value==this.char_bubble.text) {
var context=this;
        setTimeout(function() {


  context.addVariantsHtml(context.updateCharacter());


},1000);

    } else {
        // wrong

              swoshsound.play();

    }
    console.log(log);
},