2009-08-07 6 views
0

私は古典的なjavascriptローカル変数スコープのトピックでいくつかの問題を抱えていますが、JSON変数を扱っています。私は同じことに関して他の質問を見てきましたが、何も私のケースに正確には一致していませんでしたので、ここに行きます。私は3つのメソッド:func1、func2、およびfunc3を持つjavascriptから作成したクラスを持っています。また、jqueryで作成しているajax呼び出しからメソッドの1つに設定されているローカルJSON変数がありますが、そのローカル変数値を返すメソッドを呼び出すと設定されません。私は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

あなたはサムにいる。今私はそれを回避するための良い方法を見つける必要があります。ありがとう! –

0

私は「これは」あなたのコールバックの内側に「これ」という定義された関数func2同じではないと思います。 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

私は完全に間違っている可能性がありますが、「this」変数があなたを悩ませているようです。 "this"変数は、関数の呼び出し方法によって異なります。あなたは本当にそれを使用したくないようです。代わりに、私が使用:

func2() { 
    var that = this; 

その後コード使用中:

function(data){ 
    that.z = eval... 
関連する問題