2009-06-11 3 views
19

を不明瞭に私は次のようにjQueryのeachメソッドを実行する機能が含まれているJavaScriptオブジェクトを作成しています:。

function MyClass { 

    Method1 = function(obj) { 
    // Does something here 
    } 

    Method2 = function() { 
    $(".SomeClass").each(function() { 

     // 1   2 
     this.Method1(this); 

    }); 
    } 

} 

THISが参照しているオブジェクト? jQueryは、each反復から返されたアイテムを参照しています。しかし、私はThis[1]が含まれているクラスを参照するようにしたいと思います...

どのようにjQueryループ内から含むクラスを参照できますか?

function MyClass { 
    Method1 = function(obj) { 
     //do something here 
    } 

    Method2 = function() { 
      var containingClass = this; 
      $(".SomeClass").each(function() { 
      containingClass.Method1(this); 
      }); 
     } 
    } 
} 

答えて

20

は、私はあなたがこのような何かを行うことができると思い

このたびは 渡された関数が実行されることを意味します(これ は、すべての要素に対して一度だけです一致する) 「this」キーワードは、特定の DOM要素を指しています。 「this」は がjQueryオブジェクトを指していないことに注意してください。

個人的には、明示的なパラメータを使用することをお勧めします。このように、それはより読みやすいです:

$('#rotfl').each(function(index, domObject) 
{ 
    var jQueryObject = $(domObject); 
    // code 
}); 

あなたの質問に答えるために:JavaScriptが ダイナミック 静的スコープを持っています。あなたは、次の操作を行うことができます。

var that = this; 
$('#rotfl').each(function(index, domObject) 
{ 
    var jQueryObject = $(domObject); 
    that.DoSomething(); 
    // code 
}); 
+1

varKeyを使用してcontainingClass変数を関数のスコープにしてください。そうしないと、グローバル名前空間に入ります。 – tvanfosson

+3

-1 JavaScript 101:use var !!!!! – James

+1

そのContainingClassの割り当てにvarを投げてください。これは金色です。私のポストされたコードの要点と簡単な変更です。 –

9
+0

私はあなたの応答の詳細が好きです... –

+0

Urm、動的ではなく字句の範囲を意味していませんか? – James

+0

J-P:はい。それを指摘してくれてありがとう。 –

4

あなたが見ていることはjQueryを使って問題やそのeach()方法ではありません - それは一部の人々はJavaScriptで設計誤差であると考えるものをそれである - ネストされた関数前のスコープのコンテキストを継承する必要があるため、ネストされた関数の 'this'は別のコンテキスト(またはcall()を使用して)から意図的に呼び出されない限り、親スコープの 'this'と等しくなければなりません。

これを回避するには、ネストされた関数の前に変数に 'this'を代入して、それを参照する別の方法を持たせる必要があります。

+0

jQuery.each()は、call()(最も一般的な場合)またはapply()を使用して動作し、* this *が参照するオブジェクトを変更します。 – NickFitz

+0

はい、しかし、jQueryが()/ apply()を呼び出さなかったとしても、 'this'はまだ期待されたものではありません。試してみてください(function(){(function(){alert(!! this.works);/*存在しない* /})()}))call({works:true}); – James

2

jQuery 1.3.3では、イベントハンドラなどのコンテキストを手動で設定することができます。ところで

jQuery Edge: Bind with a Different “this”

、ここでは様々な技術は、(呼び出しを使用して、「これを」エイリアシング/適用)一般的な方法です。 DojoのPeter Higginsも同様の必要性を満たすjQuery.hitch pluginを作った。

関連する問題