2016-04-24 4 views
1

の問題私は、コードのこの部分を持っている方法の割り当て:私は予想通りthisタイプWindowのオブジェクトであるため変数とこの

function A(){ 
    this.count = 0; 
} 
A.prototype.inc = function(){ 
    this.count++; 
} 

var a = new A(); 
a.inc(); 
var f = a.inc; 
f(); 

最後の行は、作業をdeosn't。これはただのものなのですか?thisを使用する場合は、変数にメソッドを割り当てますか?

メソッドを引数として使用する場合は、通常の関数に使用するfn(a.inc)を省略し、instedを次のように使用しますか?

fn(function(){ 
    a.inc(); 
}); 
+0

あなたは 'call'を探していますか?関数を呼び出すときに 'this'を指定することができます。 – maraca

答えて

3

これはJavaScriptの有名な「迷子拘束」です。

あなたがしなければならない:あなたは

f = a.inc; 
f(); 

を言うならばfが動作しているときに、thisaにバインドされていないため、

f = a.inc.bind(a); 

を。グローバルオブジェクトにバインドされています。windowです。

ルールは、関数の内部で、thisaにバインドされ、a.fn()を言うならば、ですが、あなただけでもfn()またはg()を、言うならば、その関数の内部で、thisは、グローバルにバインドされたときにg === a.fnオブジェクトはwindowです。関数が呼び出されたときに

aに明示的 thisをバインドするには、あなたが bindを使用しない場合 a.inc.bind(a)

を使用する必要がありますが、独自の機能を使用したい、それはあまりにも大丈夫です。あなたはどうなる:

function fn() { 
    a.inc(); 
} 

または別の形:

var fn = function() { 
    a.inc(); 
}; 

この方法、fnはコンテキストをキャプチャ閉鎖され、そしてaを使用することで、スコープチェーンのスコープ内にあります。

+0

すばらしい説明 – lisp

1

JavaScriptでは、「メソッド」は実際にオブジェクトに関連付けられていません。それはプロパティに格納されている単なる関数です。 thisのバインドは、ドット表記で呼び出すと発生し、メソッドを変数に代入すると機能しません。

bindという便利なビルトインメソッドがあり、関数にはthisを値に永続的にバインドできます。これを行うと:

var f = a.inc.bind(a); 

あなたが望む動作が得られます。

aがキャプチャされ、ドット表記を使用してメソッドを呼び出すため、インライン関数を使用すると、thisがオブジェクトに正しくバインドされます。

関連する問題