Javascript数组未定义......我不确定为什么

时间:2012-03-10 00:58:42

标签: javascript arrays

我正在尝试将PHP类翻译成JavaScript。我唯一遇到的问题是从数组变量中获取一个项目。我创建了一个简单的jsfiddle here。我无法弄清楚为什么它不起作用。

(编辑:我更新了这段代码,以便更好地反映我正在做的事情。抱歉以前的错误。)

function tattooEightBall() {

this.subjects = ['a bear', 'a tiger', 'a sailor'];

this.prediction = make_prediction();

var that = this;



function array_random_pick(somearray) {
      //return array[array_rand(array)];
      var length = somearray.length;

      var random = somearray[Math.floor(Math.random()*somearray.length)];
    return random;


}


function make_prediction() {

    var prediction = array_random_pick(this.subjects);
    return prediction;
}

}
var test = tattooEightBall();
document.write(test.prediction);

7 个答案:

答案 0 :(得分:4)

在这里工作正常,你很容易不打电话

classname();

定义函数后。

<强>更新

当您调用* make_prediction *时,将不在范围内。你是在创造一个那个变量的钱,你可以在* make_prediction *上使用它:

var that = this;

this.prediction = make_prediction();

function make_prediction() {
  var prediction = ''; //initialize it

  prediction = prediction + array_random_pick(that.subjects);
  return prediction;
}

您可以在此处查看有效版本:http://jsfiddle.net/zKcpC/

这实际上非常复杂,我相信有更多Javascript经验的人可能会澄清情况。

Edit2:Douglas Crockfords用这些话解释道:

  

按照惯例,我们创建一个私有变量。这是用来制作的   私有方法可用的对象。这是一个解决方法   ECMAScript语言规范中的错误导致此错误   内部功能设置不正确。

要查看完整文章,请前往:http://javascript.crockford.com/private.html

答案 1 :(得分:0)

您永远不会致电classname。似乎工作正常。

答案 2 :(得分:0)

适合我:

(function classname() {

this.list = [];
this.list[0] = "tiger";
this.list[1] = "lion";
this.list[2] = "bear";

function pickone(somearray) {
    var length = somearray.length;          
    var random  = somearray[Math.floor(Math.random()*length)];
    return random;
}


var random_item = pickone(this.list);

document.write(random_item);

}());

你实际上是在调用classname函数吗?注意我将代码块包装在:

([your_code]());

答案 3 :(得分:0)

我不确定你要用你正在使用的类结构完成什么,所以我做了一些猜测,但是这段代码通过创建一个包含实例数据和pickone方法的classname对象来工作:

function classname() {

    this.list = [];
    this.list[0] = "tiger";
    this.list[1] = "lion";
    this.list[2] = "bear";

    this.pickone = function() {
        var length = this.list.length;          
        var random  = this.list[Math.floor(Math.random()*length)];
        return random;
    }
}

var cls = new classname();
var random = cls.pickone();

您可以在此处以交互方式使用它:http://jsfiddle.net/jfriend00/ReL2h/

答案 4 :(得分:0)

这对我来说很好:http://jsfiddle.net/YznSE/6/你刚刚没有打电话给classname()。如果你不打电话,什么都不会发生;)

答案 5 :(得分:0)

将它变成这样一个自动执行的函数:

(function classname() {

this.list = [];
this.list[0] = "tiger";
this.list[1] = "lion";
this.list[2] = "bear";

function pickone(somearray) {
    var length = somearray.length; //<---WHY ISN'T THIS DEFINED??       
    var random = somearray[Math.floor(Math.random() * length)];
    return random;
}


var random_item = pickone(this.list);

document.write(random_item);
})();

答案 6 :(得分:0)

var test = tattooEightBall();
document.write(test.prediction);

应该是:

var test = new tattooEightBall(); //forgot new keyword to create object
document.write(test.prediction()); // forgot parens to fire method

this.prediction = make_prediction();

应该是:

this.prediction = make_prediction;