2009-08-07 69 views
0

我在经典javascript局部变量作用域主题上遇到了一些麻烦,但是处理了一个JSON变量。我在这里查看了其他同样的问题,但没有任何结果与我的案例完全匹配,所以这里就是这样。我有一个我从javascript制作的类,有3个方法:func1,func2和func3。我也有一个本地JSON变量,它是在我使用jquery调用的ajax调用中的一个方法中设置的,但是当我调用返回该局部变量值的方法时未设置。我知道ajax工作正常,b/c我可以显示正在返回的数据并被设置为json变量没有问题。只有当我调用另一个与该JSON变量交互的方法时才会发生这种情况。这里是我的代码基本版本:自定义javascript类和私有变量范围问题

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 

任何想法?!?!我在绞尽脑汁!

谢谢

回答

2

我不认为这是什么做的范围。

请记住,AJAX调用是异步的,所以在返回JSON之前调用func3,并且您的匿名函数有机会将this.z设置为任何值。

+0

你在Sam身上。现在我只需要找到一个好方法来解决这个问题。谢谢! – 2009-08-07 20:31:19

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); 
      } 
     );  
    } 
0

我可能是完全错误的,但它看起来像“这个”变量搞砸了你。 “这个”变量取决于你如何调用函数。看起来你真的不想使用它。相反,我使用:

func2() { 
    var that = this; 

然后在代码中使用后:

function(data){ 
    that.z = eval...