2011-09-16 11 views
3

私は頻繁にこのようなコードがあります:javascriptエンクロージャ内の「this」にアクセスするには、どのような方法が適していますか?

function Object() { 
} 

Object.prototype.getData() { 
    // THIS LINE: 
    var object = this; 
    $.ajax({ 
     url: '...' 
     , success: function(data) { 
      object.onLoadData(data); 
     } 
    }) 
} 

var o = new Object(); 
o.getData(); 

私の質問:上記の「VARオブジェクト=この」ビットのための好適なパラダイムは何を?私はこれを見た:

var self = this; 

これは良く見えますが、私はおそらくこの方法を盗もうとします。匿名関数から親オブジェクトを参照する最も一般的な方法は何ですか?これを行うためのより洗練された方法がありますか?私はしばしば、 "var object = this;"ほとんどのオブジェクトメソッドの一番上にあります。これを避けるためのトリッキーな方法があるようです。

ありがとうございます!

答えて

2

コードを指定すると、変数を使用しないでください。

context:パラメータを使用して、コールバックにthisの値を設定します。

Object.prototype.getData = function() { 
    $.ajax({ 
     url: '...', 
     context: this, // <-----------set the context for the callbacks 
     success: function(data) { 
      this.onLoadData(data); 
     } 
    }); 
}; 

質問は$.ajaxでのみ対処するものではありませんでした場合は、その後、私は、関数にthis値をバインドするbind()[docs]を使用すると思います。

function successCallback(data) { 
    this.onLoadData(data); 
} 

Object.prototype.getData = function() { 
    $.ajax({ 
     url: '...', 
     success: successCallback.bind(this); 
    }); 
}; 

あなたは.bind()を持っていないブラウザをサポートする必要がある場合には、シムは、私はあなたが含むことができることに提供ドキュメントのリンクにあります。

+0

'Object.prototype'を実際に*拡張しているとは思っていませんが、問題のコンストラクタ名として' Object'を使用しただけです。 – user113716

+0

うわー、素晴らしい答え!私はjQueryのコンテキストがまさに私が望むものだと思う(私が以前にそれを見たことがない理由を知らない)。また、.bind()は面白いです。私はcompatコードを使用して、それを使い始めるかもしれません。残念ながら私はIE7についても心配する必要があります。 – rocketmonkeys

+0

@Rocketmonkeys:私が手伝ってくれてうれしい。 :) – user113716

1

私のコードではvar that = this;を使用していますが、私はselfも見ましたが、他の言語と同様に私は少し混乱しますが、それは予約語です。

これを回避する方法は他にはありませんが、キーワードを選択してこのケースではのみを使用し、コードベース全体で一貫して使用するときわめてきれいな対処方法ですそれと。私はobjectのようなvar名は避けたいと思います。おそらく他の場所でそれらを使用し、あなた自身やコードを管理している誰かのために混乱する状況を作り出すでしょう。

0

(これはわかっていません)私はいつもthatを名前として使っていますが、それはより良いユーモラスなことです。

2

Crockfordは、var that=thisを好んでいるようです。 ExtJsライブラリを使用している場合は、 var me= this;のように見えます。 本当にそれになると、変数の名前はそれほど重要ではありません。あなたの同輩と一貫した何かを使用して、それを読んだ初心者のプログラマーには意味があることを確認してください。

関連する問題