为什么这个数组未定义?

时间:2014-12-12 13:01:55

标签: javascript arrays

以下是我的问题代码:

var counter = new Counter();
counter.Load("20141211");

--

Counter = function () {
    this.Counters = new Array();
    this.Load = function (date) {
        $.getJSON("http://url", { "Date": date }, function (Count) {
            if (!Count.Error) {
                this.Counters[this.Counters.length] = Count;
            }
        });
    }
}

this.Counters[this.Counters.length] = Count;是未定义this.Counters的地方,我不明白上面定义的原因。

我认为在我致电new Counter()时已经定义了它,因此我可以在以后拨打counter.Load()时使用它。但它只是未定义。

如果我在哪里创建它作为线性代码,它将起作用:

var Counters = new Array();
Counters[Counters.length] = Count;

3 个答案:

答案 0 :(得分:4)

因为范围!

$.getJSON的回调中,this不再引用您对象的实例。最简单的方法是使用另一个变量(通常为self)来引用实例,并在回调中使用它:

Counter = function () {
    var self = this;
    self.Counters = new Array();
    self.Load = function (date) {
        $.getJSON("http://url", { "Date": date }, function (Count) {
            if (!Count.Error) {
                self.Counters[self.Counters.length] = Count;
            }
        });
    }
}

答案 1 :(得分:2)

this回调中.getJSON的值会发生变化。因此,请将this的值保存在其他变量名称下,并在回调中使用该值。

答案 2 :(得分:1)

因为你失去了背景。在构造函数的顶部添加var self = this;,并在回调中使用self.Counters[self.Counters.length] = Count;

Counter = function () {
    var self = this;
    this.Counters = new Array();
    this.Load = function (date) {
        $.getJSON("http://url", { "Date": date }, function (Count) {
            if (!Count.Error) {
                self.Counters[self.Counters.length] = Count;
            }
        });
    }
}