自定义javascript类和私有变量范围问题

时间:2009-08-07 19:35:40

标签: javascript json oop scope

我在使用经典的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

有什么想法吗?!?!我在想我的想法!

由于

3 个答案:

答案 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...