2011-01-03 6 views
4

この質問は最高のいくつかのコードで説明されているので、ここにある:コールバック内からこのクラスメンバーにアクセスするにはどうすればよいですか?

// a class 
function a_class { 
    this.a_var  = null; 
    this.a_function = a_class_a_function; 
} 

// a_class::a_function 
function a_class_a_function() { 
    AFunctionThatTakesACallback(function() { 
     // How to access this.a_var? 
    }); 
} 

// An instance 
var instance = new a_class(); 
instance.a_function(); 

コールバック内からAFunctionThatTakesACallback()に、1回のアクセスthis.a_varはありませんか?

答えて

6

あなたはこのように、それを参照するローカル変数を作成することにより、thisの範囲を拡大する必要があります:

function a_class_a_function() { 
    var self = this; 
    AFunctionThatTakesACallback(function() { 
     console.log(self.a_var); 
    }); 
} 

あなたがこれを行うために必要な理由はAFunctionThatTakesACallback関数内のでthis参照です現在のオブジェクトと同じではないであり、代わりにグローバルwindowオブジェクトを参照する可能性があります。 (通常はあなたが望むものではありません)。

ああ、これはclosureと言われましたか?あなたがinstance.a_function()を呼び出すと

+1

パーフェクト。それはうまく動作し、あなたは問題を説明する素晴らしい仕事をしました。 –

+0

@George Edisonありがとうございました!それは有り難いです! :) –

0

あなたは、このための値を指定することができます関数オブジェクトのcall方法、使用して試みることができる:

myFunction.call(this, args...) 

をしかし、私はこのケースでは、おそらくに「これ」を渡すことがより簡単になると思いますコールバックのパラメータの1つとして指定します。

0

、あなたは本当にthisとしてinstancea_class_a_functionを呼んでいるので、あなたはそのようa_class_a_functionを変更することができます。

function a_class_a_function() { 
    var self = this; 
    AFunctionThatTakesACallback(function() { 
     // do something with self.a_var 
    }); 
} 

ここでの問題は、あなたからそれを呼び出すことなくa_class_a_functionをコールしようとすると、インスタンスの場合、thisは、グローバルオブジェクトwindowを参照する可能性があります。

関連する問題