为什么我的函数返回undefined?

时间:2014-04-20 15:44:32

标签: javascript return box2d undefined box2dweb

使用easeljs和box2d,我创建了几个相互碰撞的对象。使用以下代码我在屏幕上创建一个框:

var b = new Box(400,0); // pass xPos and yPos
stage.addChild(b.view);

在我的脚本中的某个位置,该框与圆圈碰撞,当发生这种情况时,三角形必须向框中填充Tween。所以我需要盒子的位置!在我的Box.js中,我有以下功能:

function getX(){
    var xPos = this.body.GetPosition().x * SCALE;
    return xPos;
}

我已为以下功能替换了相同的功能:

function getX(){
    return this.x;
}

两个函数在使用console.log(b.getX);的浏览器控制台时返回相同的值,这是未定义的。我需要使用return函数传递参数,还是我的函数结构不正确?

2 个答案:

答案 0 :(得分:4)

你说的是console.log(b.getX),

首先,您没有执行该功能,而是记录其内容。 其次,该函数不是var b 的属性。

// create the function.
b.getX = function()
{
 this.x;
};

// runs the command.
b.getX();

编辑:

Jsfiddle解释你做错了什么: http://jsfiddle.net/kychan/zsWpN/

编辑2:

首先,我将解释一下'属性'是。物业是一件事'由某个对象拥有。让我们定义一个var并实例化它:

var x = {}; // this makes an object.

我们也可以用它添加属性:

var y = {myProp1:'Hello', myProp2:'World'};

这会创建一个具有两个属性(myProp1和myProp2)的对象(y)。

现在,在您的代码(jsfiddle)中,您拥有(全局)函数getX。这不是设置为属性,因此必须将其作为全局语句调用:

getX(b); // should return this.x;

提供更全面的解释:http://jsfiddle.net/kychan/WwxC9/

//    METHOD 1 (Your method); works, but you can do it more directly, see METHOD 2.
//    define the var, with 'var'.
//    let it hold a (global) function.
var getX = function(object){
    return object.x;
};

//    we make a test variable holding an object with property x:
var foo = {x:4};
console.log(getX(foo)); // this should return 4.

//    METHOD 2:
//    we will make a normal function (which has the same execution as METHOD 1).
function getX2(o)
{
    return o.x;
}

//    create a test variable.
var bar = {x:4};
console.log(getX2(bar)); // should print 4 as well.

//   METHOD 3:
//    now we create a CLASS which has a default property named getX:
function myObject()
{
    this.x     = 4;

    //    here, this is called a method (because it is a property owned by a class/object).
    this.getX  = function()
    {
        return this.x;
    };
}

//    we create a test variable holding the object from the class myObject.
var baz = new myObject();
console.log(baz.getX()); // now it ALSO should print 4!

答案 1 :(得分:1)

与Kai的例子一起,我终于开始工作了!所以,谢谢凯!我使用他在最后编辑中显示的第三种方法,通过在我的框函数的tick函数中添加一个变量来进行一个小的工作。这是我做的:

在我的Box.js我用box2d创建了一个b2_staticBody,我给它一个getX函数,它返回框的x位置。

this.getX = function(){
    return boxX;
}

我的tick功能(用easeljs创建)更新了盒子的位置,所以在这里我将box.x保存到名为boxX的var中。

function tick(e){
    boX = this.body.GetPosition().x * SCALE;

    this.x = this.body.GetPosition().x * SCALE;
    this.y = this.body.GetPosition().y * SCALE;
    this.rotation = this.body.GetAngle() * (180/Math.PI);
}

现在,我可以在创建框后调用b.getX();函数。

b = new Box(350,450); // x and y position
stage.addChild(b.view);
var targetX = b.getX();
console.log(targetX);

再次感谢Kai帮助我了解如何解决我的问题并理解使用属性等。