Javascript数组未定义。。。而我';我不知道为什么

Javascript数组未定义。。。而我';我不知道为什么,javascript,arrays,Javascript,Arrays,我正在尝试将一个PHP类转换为JavaScript。我唯一遇到的问题是从数组变量中获取项。我创建了一个简单的JSFIDLE。我不明白为什么它不起作用 (编辑:我更新了此代码以更好地反映我正在做的事情。对于以前的错误,我深表歉意。) ​ 在这里很好,你不打电话很简单 classname(); 定义函数之后 更新 当您调用*make_prediction*时,此操作将不在范围内。你是对的,创建了一个变量,在*make_prediction*上使用它: var that = this; this.

我正在尝试将一个PHP类转换为JavaScript。我唯一遇到的问题是从数组变量中获取项。我创建了一个简单的JSFIDLE。我不明白为什么它不起作用

(编辑:我更新了此代码以更好地反映我正在做的事情。对于以前的错误,我深表歉意。)


在这里很好,你不打电话很简单

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;
}
您可以在此处看到工作版本:

这实际上相当复杂,我相信在Javascript方面有更多经验的人可能能够澄清这种情况

编辑2:Douglas Crockfords用以下文字解释:

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


要查看完整的文章,请转到:

在这里可以正常工作,您只需不打电话即可

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;
}
您可以在此处看到工作版本:

这实际上相当复杂,我相信在Javascript方面有更多经验的人可能能够澄清这种情况

编辑2:Douglas Crockfords用以下文字解释:

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


要查看完整的文章,请访问:

您从未调用过
classname
。似乎工作正常。

您从未调用过
classname
。似乎工作正常。

适合我:

(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]());
为我工作:

(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]());

我不确定您使用的类结构到底要实现什么,所以我做了一些猜测,但这段代码通过创建一个具有实例数据和
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();

您可以在此处以交互方式使用它:。

我不确定您使用的类结构到底想要实现什么,所以我做了一些猜测,但这段代码通过创建一个具有实例数据的classname对象和一个
pickone
方法来工作:

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();

您可以在此处以交互方式使用它:。

它对我来说运行良好:您只是没有调用
classname()
。如果你不打电话,什么也不会发生;)

对我来说很好:你只是没有调用
classname()
。如果你不打电话,什么也不会发生;)

将其转换为如下自动执行函数:

(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);
})();
(函数类名称(){
this.list=[];
此.list[0]=“老虎”;
此.list[1]=“lion”;
此.list[2]=“熊”;
函数pickone(somearray){

var length=somearray.length;//将其转换为如下自动执行函数:

(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);
})();
(函数类名称(){
this.list=[];
此.list[0]=“老虎”;
此.list[1]=“lion”;
此.list[2]=“熊”;
函数pickone(somearray){
var length=somearray.length//
应该是:

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

应该是:

var test = new tattooEightBall(); //forgot new keyword to create object
document.write(test.prediction()); // forgot parens to fire method
this.prediction = make_prediction;
应该是:

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

应该是:

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

哈!对不起,我把代码精简得太多了,我想它解决了我的问题。我已经用更准确的版本修改了代码(这不起作用):Emerson,所以它仍然不起作用?如果你能提供你正在使用的页面,或者你在fiddle上的确切功能/用法,我们可能会提供帮助。你没有从纹身球返回任何内容。请尝试在函数末尾添加一个return this;.AHA。这使它在JSFIDLE上起作用,但由于某些原因,我无法让我的实际代码运行k、 这里有一个较新的JSFIDLE(我不明白为什么它不能以完全相同的方式工作!)。我得到一个错误,说我的“主题”的“长度”属性数组是未定义的:@Emerson-看看我对构成类的工作JSFIDLE的回答。在我看来,你不明白
this
操作符在javascript中是如何工作的。如果你只调用一个普通javascript函数,那么
this
在该函数中被设置回
窗口
。你要么使用e> fn.应用(此…)
obj.fn(…)
使
的值正确设置。在小提琴中,当您调用
make_prediction()时
,它会释放
的值,因此该值在函数内部设置不正确,您会收到一个javascript错误。哈!对不起,我太过简化了代码,我想它解决了我的问题。我已经用更准确的代码版本修改了代码(该版本不起作用):Emerson,所以它仍然不起作用?如果你能提供你正在使用的页面,或者你在fiddle上的确切功能/用法,我们可能会提供帮助。你没有从纹身球返回任何内容。请尝试在函数末尾添加一个return this;.AHA。这使它在JSFIDLE上起作用,但由于某些原因,我无法让我的实际代码运行k、 这里有一个较新的JSFIDLE(我不明白为什么它不能以完全相同的方式工作!)。我收到一个错误,说我的“subjects”数组的“length”属性未定义:@Emerson-看看我对一个正在工作的JSFIDLE的回答,它构成了一个类。在我看来,你好像不明白
这个
是如何定义的