【问题标题】:Why does my function return undefined?为什么我的函数返回未定义?
【发布时间】:2014-06-04 17:56:53
【问题描述】:

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

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

在我的脚本中的某个点,盒子与一个圆圈发生碰撞,当这种情况发生时,一个三角形必须对盒子进行补间。所以我需要盒子的位置!在我的Box.js 我有以下功能:

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

我已经为以下函数替换了相同的函数:

function getX(){
    return this.x;
}

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

【问题讨论】:

  • this.body 定义了吗?

标签: javascript return box2d undefined box2dweb


【解决方案1】:

你说的是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!

【讨论】:

  • 我以为我明白了,但我显然不明白,因为我一遍又一遍地得到相同的控制台日志“未定义”。我目前在我的主文件中有以下内容: b.getX(); bX = b.getX();控制台.log(bX);在我的 Box.js 中 this.getX = function(){ return this.x;};
  • 没关系。我想每个人都有类似的“doh!”某个时候:)。如果您一直看到您的代码,则调试起来会更加困难。我解决了你的问题吗?如果是这样,您可以将其设置为“已解决”。它也可以帮助其他人。
  • 不抱歉,我不清楚:P 不幸的是,它没有工作,我仍然不明白我做错了什么。如果我理解正确,这应该是我的 Main.js jsfiddle.net/s9gGW/1,因为它仍然返回 undefined。
  • 我再次编辑了我的答案。我希望它有所帮助。在您的新 jsfiddle 中有两个错误:(1)您忘记了 var,但没有它它仍然可以工作。 (2) 你还没有创建对象 m (var m={x:'bla'};)。然后你的小提琴奏效。我的新小提琴解释了所有这些“属性”、“方法”等是什么。我建议也查看 w3schools 页面:w3schools.com/js/js_obj_intro.asp
  • 我知道并理解什么属性也是一个对象。正如您所说,不添加 var 应该可以工作。我删除了一些可能导致混淆的东西,因为我使用的是 box2dWeb,但这里是涉及 GetX() 问题的所有代码的小提琴。 jsfiddle.net/Tomjesch/jCjMh/1
【解决方案2】:

加上 Kai 的示例,我终于成功了!所以,谢谢凯!我使用了他在最终编辑中展示的第 3 种方法,通过在我的 box 函数的刻度函数中添加一个变量来解决这个问题。这是我所做的:

在我的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 帮助我了解如何解决我的问题并了解使用属性等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2022-01-16
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多