闭包返回undefined意外

时间:2014-03-16 20:22:47

标签: javascript closures melonjs

我正在创建一个melonJS游戏。

在我的播放器实体 - game.PlayerEntity = me.ObjectEntity.extend({中,其更新功能会检查碰撞:

game.PlayerEntity = me.ObjectEntity.extend({
   var collision = me.game.collide(this); 

   if (collision) {
       if (collision.obj.type == me.game.ACTION_OBJECT) {
           console.log("NPCname: " + game.NPCEntity.init); //get settings from NPCEntity
       }
   }

然后在我的NPC实体对象game.NPCEntity = me.ObjectEntity.extend ({中,我想将settings.name返回到上面的PlayerEntity。为此,我创建了一个闭包returnSettings()

1)console.log(settings.name)按预期输出“Lee”

2)return settings.name输出“undefined”

为什么会这样?

game.NPCEntity = me.ObjectEntity.extend ({
    init : function(x, y, settings) {
        settings.image = "wheelie_right";
        settings.spritewidth = 64;
        settings.name = "Lee";
        this.parent(x, y, settings);

        this.collidable = true;
        this.type = me.game.ACTION_OBJECT;

        console.log(settings.name); //works
        console.log("returning... " + returnSettings()); //works

        //closure to return settings values externally
        function returnSettings () {
            return settings.name; //returns undefined when called by PlayerEntity above.
        }
    },

谢谢!

2 个答案:

答案 0 :(得分:1)

  1. 你不应该在这里使用一个闭包
  2. game.NPCEnity不引用实例,而是构造函数。如果在构造函数中设置this.settings = …,则在实例上创建属性。
  3. 您可以使用处理冲突的update函数中的this keyword访问实例,其中它指向player

    引用教程:

    // call by the engine when colliding with another object
    // obj parameter corresponds to the other object (typically the player) touching this one
    onCollision: function(res, obj) {…}
    

    这意味着您可以通过该事件处理程序中的obj.settings访问敌人设置。


    如果你没有使用那个处理程序而是调用collide method,从我看到的那个函数的返回值有一个.obj属性,可能是碰撞目标:

    if (collision) {
        if (collision.obj.type == me.game.ACTION_OBJECT) {
            console.log("NPCname: " + collision.obj.settings.name); //get settings from NPCEntity
        }
    }
    

答案 1 :(得分:0)

显然,您可以在定义之前调用该函数,因为它是以函数名称(){} 方式而不是表达式定义的:https://stackoverflow.com/a/261682/880114

但是,我不知道你从哪里返回该函数从其他地方调用它。