2010-12-14 20 views
0

JSでリアクティブフレームワークをテストしようとしているオブジェクトがありますイベントサブスクリプションでは、サブスクリプションが定義されているクラス。Reactive Frameworkサブスクリプション内のインスタンス変数/メソッドをJavaScriptで使用する

function MyClass() 
{ 
    var DoSomething = function(a,b) { ... } 

    var InstanceVariable = 1; 

    this.uiEvent = uiDiv.jqueryUiWidget("widget") 
     .toObservable("change") 
     .Subscribe(
       function (event) 
       { 
        // Want to call the instance method in the enclosing class 
        DoSomething(1,2); 
       }); 

    this.uiEvent2 = uiDiv.jqueryUiWidget("widget") 
     .toObservable("change") 
     .Subscribe(
       function (event) 
       { 
        // Want to use the instance variable within here 
        alert(InstanceVariable); 
       }); 
} 

「this」スコープがサブスクリプションのスコープなので、どうすればよいですか?何らかの方法でサブスクリプションを設定するときに、関数/変数を渡す必要がありますか?

これを実行しようとすると、すべてのブラウザでインスタンス変数またはメソッドが存在しないというエラーが表示されます。インスタンスメンバーを呼び出す関数のスコープ内の「this」は、あなたのコードは動作するはずのようにオブザーバーのでOnNextの機能を有し、OnCompletedなど

多くのおかげで、

ポール

答えて

1

は私には思えます。あなたが何か問題を抱えているなら、私はそれらを説明することをお勧めします。しかし、にはがどのように動作するかを尋ねている場合は、クロージャについて知っておく必要があります。ウィキペディアから:コンピュータサイエンスの

閉鎖はレキシカル環境にバインドされている自由変数を持つ第一級関数です。このような関数は、その自由変数を「閉じた」と言われています。クロージャは、そのフリー変数の範囲内で定義され、これらの変数の範囲は、クロージャ自身の存続期間と少なくとも同じです。クロージャの明示的な使用は、関数型プログラミングや、MLやLispなどの言語に関連しています。クロージャは継続継承スタイルを実装するために使用され、このようにして状態を隠す。したがって、オブジェクトや制御構造などのコンストラクトはクロージャで実装できます。

これはDoSomethingInstanceVariableは、それらが定義されている範囲内で定義されている任意の方法からアクセス可能であることを意味します。 MyClassコンストラクタが呼び出されるたびに、これらの変数の新しい「インスタンス」が存在します。

+0

Markusにお答えしてくれてありがとうございます。はい、私はクロージャとインスタンス変数について知っていますが、サブスクリプション内の "this"リファレンスは囲むオブジェクトを参照していません。私は観察している(エーヘン)。 –

+0

'this'キーワードが外側(MyClass)ではなく内部メソッド自体を参照することは間違いありません。あなたは 'this'キーワードを使用していますか?内部メソッドの中で 'outerThis'を使用することができます。 –

+0

ありがとうMarkus - var outerThis = this; (今は明らかです...私は、その一時変数を割り当てることなく、よりエレガントなアプローチを探していました)。 –

関連する問題