以下是我的问题代码:
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;
答案 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;
}
});
}
}