質問: 'テスト'; console.log(this); } Hoge(); //Window window.p; //テスト this.p; //テスト ```
回答: おっしゃる通り、thisが指す物は呼び出し方によって変わります。 (this は変数ではなくキーワードなので所属、というかスコープのような物は無いと思います) ### 関数呼び出し > > ・普通に関数呼出しするとthisはwindow > > > これは strictモードか否かによって変わります。 ``` function Hoge(){ "use strict"; return this; } Hoge(); // -> undefined ``` 上記のように strictモードでは this は undefined です。非strictモードではグローバルの this (ブラウザでは window)になります。 ### メソッド呼び出し ``` function Hoge(){ return this; } obj = {a: 1, b: 2, hoge: Hoge}; obj.hoge(); // -> obj ``` 他のオブジェクトのメソッドとして呼び出されると、this はその呼び出しに使ったオブジェクトになります ### `call`や`apply`による呼び出し ``` function Hoge(){ return this; } obj = {a: 1, b: 2}; Hoge.call(obj); // -> obj Hoge.apply(obj); // -> obj ``` call と apply は this のオブジェクトを何にして実行するか指定して、関数を呼び出します。 new による呼び出し ``` function Hoge(){ this.p2 = "set in Hoge"; } Hoge.prototype.p = "set in prototype"; new_obj = new Hoge; new_obj.p; // -> "set in prototype" new_obj.p2; // -> "set in Hoge" ``` new は 新しいオブジェクトを作ります。 そのオブジェクトのプロトタイプには、与えられた関数オブジェクトの「prototypeプロパティ」が設定されます。 そして、this はその新しいオブジェクトになります。 ### 注意 > > ・関数定義した時点で既に、thisはwindow? > > > window.p; //undefined > > Hoge.p; //undefined > > > Hogeのプロパティである`Hoge.p`は Hoge関数の定義内の this.p とは関係ありません。 Hogeにプロパティを追加するには、 ``` Hoge.p = 1; ``` のようにします。このように代入しても、もちろん this.p には何の影響もありません。