2012-03-30 9 views
1

私はテキストエディタでFireFox 11でJavaScriptを書いています。以下の場合、 "var n = this.val"は "undefined"になります。どのように元のクラスオブジェクトのローカル値を取得するには?jQuery.ajaxで "this.value"を取得する方法

<html> 
<body> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
<script> 
var Test = { 
    val : 0, 
    begin: function(v){ 
     this.val = v; 
     this.recieve(); 
    }, 
    complete: function(o){ 
     var n = this.val; // undefined 
    }, 
    recieve : function(){ 
     $.ajax({ 
      url : "http://www.yahoo.com/", // Dummy 
      type: "POST", 
      dataType: "json", 
      complete: this.complete, 
      timeout: 1000, 
     }); 
    }, 
}; 

var c = Object(Test); 
c.begin(10); 
</script> 
</body> 
</html> 

答えて

0

completeがコールバックであるので範囲が変更されたとthisTestと呼ばれるオブジェクトを参照しません。あなただけcomplete機能にTestthisを交換する必要があります。

var n = Test.val; 

=== === UPDATE

あなたの質問だった「元のクラスオブジェクト内の局所的な値を取得するには?」。私の答えは、の静的オブジェクトのフィールドを取得する方法を示しています。

あなたは共有オブジェクトが必要な場合には、構造を変更する必要があります。

function Test() { 
    var self = this; 
    this.begin = function(v) { 
     this.val = v; 
     this.recieve(); 
    } 
    this.complete = function(o) { 
     var n = this.val; 
    } 
    this.recieve = function() { 
     $.ajax({ 
      url : "http://www.yahoo.com/", // Dummy 
      type: "POST", 
      dataType: "json", 
      complete: function(data) { 
       self.complete(data); 
      }, 
      timeout: 1000, 
     }); 
    } 
} 

今、あなたは、2つの異なるオブジェクトを作成することができます。完全なハンドラthisインサイド

var c2 = new Test2; 
c2.begin(10); 
var d2 = new Test2; 
d2.begin(20); 
+0

この場合、Test.valは上書きされます。 var c =オブジェクト(テスト); c.begin(10); var d =オブジェクト(テスト); d.begin(20); – Tank2005

+0

私は自分の答えを更新しました。 – scessor

+0

正常に動作します。ありがとうございました。 – Tank2005

1

complete: this.complete.bind(this)

これは、古いIEのバージョンでは動作しませんが、いくつかの努力(es5 shimコードを追加)と1は、それもそこ作業することができます。

complete機能はajax要求のコンテキストで実行されます。あなたはこのようなコードを記述する場合:

var method = Test.complete; 
method(); 

this

は保存されていない、あなただけの機能へのリンクを取得します。 name1.name2()にはjsのトリックがあります。 name2は、 name1のプロパティでなければならず、関数である必要がありますが、(name2)も name1のコンテキストで実行されます。

var x = 'outer', b = { 
    x: 'inner', 
    a: function() { return this.x; } 
}; 
[(b.a)(), (m = b.a)()] // ["inner", "outer"] 
0

Testではありません。一般的な解決方法は、プロキシ変数を作成することです。 (この場合)

recieve : function(){ 
    var proxy = this; 
    $.ajax({ 
     url : "http://www.yahoo.com/", // Dummy 
     type: "POST", 
     dataType: "json", 
     complete: function(){ 
       proxy.complete(); 
     }, 
     timeout: 1000, 
    }); 
}, 

又は単にTest.val

complete関数内
complete: function(o){ 
    var n = Test.val; 
}, 
関連する問題