我正在尝试从jQuery ajax调用中调用实例方法a()。但是当我这样做时,它说该方法没有定义。我认为这是因为a()不在$的范围内。但我认为它将成为范围链的一部分。 a()如何在范围内?
function Z() {
this.x = 0
this.a = function() {
return this.x;
}
this.b = function() {
$.ajax({
...
success: function(data, textStatus, xhr) {
this.a(); //a() is not defined
},
...
});
}
}
z = new Z();
z.b();
答案 0 :(得分:3)
大多数人都会提出像var that = this;
这样的技巧,但我更喜欢使用功能绑定来更优雅,更清晰地实现相同目的。
创建一个本地函数a
,this.a
绑定到this
:
function Z() {
this.x = 0
this.a = function() {
return this.x;
}
this.b = function() {
var a = this.a.bind(this);
$.ajax({
...
success: function(data, textStatus, xhr) {
a();
},
...
});
}
}
z = new Z();
z.b();
答案 1 :(得分:2)
其他解决方案几乎肯定会起作用,但是使用jQuery做一个更加流畅,更惯用的方法:使用context
option with $.ajax()
:
上下文
此对象将成为所有与Ajax相关的回调的上下文。默认情况下,上下文是一个对象,表示调用中使用的ajax设置(
$.ajaxSettings
与传递给$.ajax
的设置合并)。
$.ajax({
...
context: this,
success: function(data, textStatus, xhr) {
this.a(); //a() is now defined :)
},
...
});
答案 2 :(得分:2)
没有“那个”技巧,改变context of the ajax callbacks
context: this,
success: function(data, textStatus, xhr) {
this.a(); //a() is not defined
答案 3 :(得分:1)
试试这个:
function Z() {
var that=this;
this.x = 0
this.a = function() {
return that.x;
}
this.b = function() {
$.ajax({
...
success: function(data, textStatus, xhr) {
that.a(); //a() is not defined
},
...
});
}
}
z = new Z();
z.b();
答案 4 :(得分:1)
你不能在回调函数中使用'this'。
function Z() {
var that=this;
this.x = 0
this.a = function() {
return this.x;
}
this.b = function() {
$.ajax({
...
success: function(data, textStatus, xhr) {
that.a(); //a() is not defined
},
...
});
} }
答案 5 :(得分:0)
var that=this;
使用that.a
。内部函数/对象无法使用this
,您必须使用that=this
技巧。
答案 6 :(得分:0)
this
时, this.a()
是jQuery Ajax对象。你需要做这样的事情:
function Z() {
this.x = 0
this.a = function() {
return this.x;
}
this.b = function() {
var that = this;
$.ajax({
...
success: function(data, textStatus, xhr) {
that.a(); //a() is not defined
},
...
});
}
}
z = new Z();
z.b();