2012-04-04 7 views
7

これは私が答えを知っておくべきだと確信していますが、私はただばかであるか、私はちょっと前にこれを見つけていません...配列内の関数のコンテキストとは何ですか?

次の配列が与えられているとします。グローバルスコープ:

var arr = [function() { 
    console.dir(this); 
}]; 

私は、thisがWindowオブジェクトを参照すると予想しました。関数を呼び出すときしかし、:

arr[0]();​ //Logs Array 

thisは実際には配列を参照することが表示されます。私は別の変数内の関数への参照を格納して、それを呼び出すときに、thisは、Windowオブジェクトを参照しない:

だから、
var func = arr[0]; 
func(); //Logs Window 

を、なぜ機能変更のコンテキストはいますか?ここにはfiddle demonstrating the above two casesがあります。

+0

'これは所有者を指しているので、所有者は実行時に参照されると思います。 http://www.quirksmode.org/js/this.html – Silvermind

答えて

5

あなたがそのようなobj.func()として、オブジェクトのプロパティとして関数を呼び出すと、thisobjを指します。
これはまさにあなたがここでやっていることです。 arrがオブジェクトで、0が関数を保持するプロパティです。

注:配列は単なるオブジェクトであり、その要素はプロパティの値です(プロパティは通常数値文字列です(すべてプロパティは文字列です))。

は、この場合には、詳細はMDN - thisを参照:

関数はオブジェクトのメソッドとして呼び出されると、そのthisがメソッドがコールされるオブジェクトに設定されています。あなたの第2のケースで

、あなたはそれゆえthiswindowを指し、「スタンドアロン」関数を呼び出します。コードがstrictモードで実行された場合、thisundefinedとなります。

+0

より正確には、 'window' **は**オブジェクトであり、すべてのグローバル**は** windowの引数です。 – freakish

+0

"結局のところ、配列は単なるオブジェクトです" ...それは完全な意味を成しています。私はただばかげていた。ありがとう。 –

+0

@freakish:これはどのように質問に関連していますか?変数がグローバルでない場合でも 'this'は' window'を指します。 OPのコードでは、 'func'は他の関数のローカル変数でもあります。私はグローバル変数が 'window'の* properties *であると仮定します。 –

0

これは実際には、thisというキーワードは、呼び出された関数の所有者(または所有者)への参照を返す演算子です。最初のケースではホルダーは配列(オブジェクト)であるため、配列を返します。後者の場合、ホルダーはウィンドウオブジェクトです。

詳細はthis articleを参照してください。

0

は注意して:

はJavaScriptで、thisは常に機能の所有者を指します。

at quirksmodeについて詳しく読むことができます。

0

要素が配列のメンバーであるため、そしてthis常にポイント所有者オブジェクトへの(あなたがbind()/call()/apply()などで遊ぶ場合を除きます)。オブジェクトの一部でない場合は、thisがグローバルオブジェクトになります。ブラウザ環境ではwindowです。例外は、厳格なモードの場合です。ここで、thiswill be undefinedです。概念的より多くの意味を行うことができる

var ar = { 
    '0' : function() { 
     console.dir(this); 
    } 
} 

ar[0](); 
var func = ar[0]; 
func(); 

...:何をやっている

が効果的に同じです。

http://jsfiddle.net/TVtwr/1/

+0

それほど同じではありません。配列は、普通のオブジェクトとは異なる振る舞いを持つ異なる「型」です。 –

+0

@MichaelAnderson:私は 'this'の解決を意味しました。 – Matt

関連する問題