2016-10-31 2 views
2

私はオブジェクトがあるとします。`this`がここo`(o.method)`を意味しないのはなぜ()の代わりにグローバルオブジェクトの

var o = { 
    prop: 3, 
    method: function() {return this.prop} 
} 

私はこの

(o.method)() 

を期待していましたundefinedを返しますが、3を返して、thisomethodに設定します。それはなぜそうですか? (o.method)を別々に評価すると、スタンドアロン関数と評価されるため、thisはグローバルオブジェクトを参照すると予想されました。なぜ、例えば、違いがここに存在します:

(o.method)() vs (o.method || true)() 

私はo.method()質問はこの(o.method)のように最初の関数にアクセスし、それを呼び出すことについて、具体的で、コンテキストとしてoを使用することを知っています。

+0

'o.method()'は 'method.call(o);'のショートカットです。これは役に立ちますか? – freakish

+0

また、試してみてください: 'var a = {prop: 'foo'、fn:o.method}; 'this'は関数が呼び出されるオブジェクトになります) – njzk2

答えて

2

これはJavaScriptのルールの仕組みです。あなたが曲げを行わない限り、thisは、それを呼び出す前にメソッドにアクセスすると、通常、.より前のものを意味します。この場合、それはoです。

次のステートメントは同一です:あなたが何か他に方法を置けば

(o.method)(); 
o.method(); 
o.method.call(o); 
o["method"](); 

しかし、それは上だ事の意味に取るよ:

var p = {prop: 42, method: o.method}; 
p.method(); // returns 42 

var method = o.method; 
var prop = 13; 
method(); // returns 13 

注意:JavaScriptが元々設計されたものよりもはるかに成長したので、人々はこれがおそらくthisの最も直感的な方法ではないことに気付きました。したがって、ES3では"Arrow Functions"(別名La mbda関数)それはwon't rebind thisです。

+0

私はあなたに同意しますが、' => '機能はOPが期待するように動作するため機能します。 – Mobius

+0

これは一般的にプロパティの参照に適用されます: 'o [" method "]()'は同じことを行います( 'foo.bar'は' foo ["bar"] 'の構文的な砂糖です)。 – melpomene

+0

ありがとう、私の更新を参照してください。私は最初に推測したあいまいな方法で質問を策定しました –

関連する問題