我在使用经典的javascript局部变量范围主题时遇到了一些问题,但是处理JSON变量。我在这里看到了关于同样事情的其他问题,但没有任何东西与我的情况完全匹配,所以这里有。我有一个我用javascript制作的类,它有3个方法:func1,func2和func3。我还有一个本地JSON变量,它是在我使用jquery进行的ajax调用中的一个方法中设置的,但是在我调用返回该局部变量值的方法时没有设置。我知道ajax工作正常,b / c我可以显示正在返回的数据并正确设置为json变量没有问题。只有当我调用另一个与该JSON变量交互的方法时才会发生这种情况。这是我的代码的基本版本:
function func1(){
func2();
}
function func2(){
$.getJSON("http://webservice.mydomain.com/methodname&jsoncallback=?",
function(data){
this.z = eval("(" + data.d + ")");
alert(data.d); //this displays the data!
alert(this.z.ArrayProperty[0].Property1); //this displays
//the correct data too!
}
);
}
function func3(){
return this.z.ArrayProperty[0].Property1;
}
function myClass(var1, var2){
this.x = var1;
this.y = var2;
this.z = "";
this.func1 = func1;
this.func2 = func2;
this.func3 = func3;
}
然后在我的.html页面中,我有以下代码:
var obj = new myClass(1,2);
obj.func1("abc");
alert(obj.func3()); //ERROR: this.z.ArrayProperty is undefined
有什么想法吗?!?!我在想我的想法!
由于
答案 0 :(得分:2)
我认为这与范围无关。
请记住,AJAX调用是异步的,因此在返回JSON之前调用func3,并且您的匿名函数有机会将this.z设置为任何内容。
答案 1 :(得分:0)
我不认为你的回调中的“this”与定义func2的“this”相同。使用Prototype JavaScript库,您可以使用bind()来解决这个问题。
您可以在func2中添加一个新变量,或者在您使用的任何库中使用绑定函数。
func2() {
var me = this;
$.getJSON("http://webservice.mydomain.com/methodname&jsoncallback=?",
function(data){
me.z = eval("(" + data.d + ")");
success = true;
alert(data.d); //this displays the data!
alert(this.z.ArrayProperty[0].Property1);
}
);
}
答案 2 :(得分:0)
我可能完全错了,但看起来“这个”变量让你搞砸了。 “this”变量取决于你如何调用函数。看起来你真的不想使用它。相反,我使用:
func2() {
var that = this;
然后在代码中使用:
function(data){
that.z = eval...