2012-02-01 8 views
3

は、このスニペットを見てみましょう:Javascriptを:X = obj.fn対obj.fn(); X()

var obj = { 
    fn: function() {return this;} 
}; 
var x = obj.fn;  

obj.fn(); // returns obj 
x(); // returns window (in the browser) 

obj.fn()x=obj.fn; x()異なっているなぜ私は好奇心が強いです。単一の式の中で関数呼び出しの直後にある属性ルックアップの特別なケースはありますか?(例えば、Pythonのdescriptor protocolのような)より複雑な魔法がありますか?

答えて

6

thisコンテキスト変数の値は、常に関数の呼び出し方法によって異なります。

obj.fn(); 

は、常にこの場合objに、含まれているオブジェクトを参照する、そのthis値を意味methodとしての機能を呼び出します。直接x関数内の参照を格納することにより

は、それが常に非ES5-strictモード環境でglobal objectを参照すると、それはES5 strictモードでundefinedなることを意味している、グローバルスコープの「ちょうどそのよう」と呼ばれています。

したがって、変数内のオブジェクトメソッドを参照するときは常に注意する必要があります。そのようなメソッドがthis.someProp経由でそれ自身のオブジェクトからいくつかのデータにアクセスしたい場合は、thisが別のオブジェクト/コンテキストにバインドされていると明らかに失敗します。


免責事項:「常に含むオブジェクトを参照するには、」完全に正しくありません。関数がFunction.prototype.bind()経由で別のオブジェクトにバインドされていた場合は、常にという参照オブジェクトが参照されます。

+0

関連するES5仕様のセクション:http://ecma262-5.com/ELS5_HTML.htm#Section_11.2.3 –

+0

@Tim Down:ありがとう、私はそれ自身を見つけられませんでした。残念なことに、その仕様の可読性は疑問に思えます。:)とにかく、プロパティルックアップと呼び出し演算子の構成は、別々に使用するよりも異なる結果になることは残念です。 –

関連する問題