2009-08-07 66 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...