JavaScript再入門3 - thisは何を意味するか
例によってこちらにお世話になります。
最強オブジェクト指向言語 JavaScript 再入門!
6. thisの解釈は状況によっていろいろ。
Javaにおいてthisといえば非常に明確で、インスタンス変数を明示的に指定するとかインスタンスのメソッドを呼ぶときにsuperでなくthisなのよってな感じで書くものであった。しかしJavaScriptにおいてthisというのはコンテキストによって全く異なる意味合いを持つ。
ルール1:グローバルスコープにおいて、thisはwindowを指す
これは非常に簡単。windowがオブジェクトの起点なのでグローバルスコープにおいてthisはwindowとなるというのは納得できる。
//グローバルスコープ console.log(this);//1番目のthis、windowを指す
ルール2:関数呼び出しにおいて、thisはwindowを指す
まあこれもそういうもんかという感じ。
function global_function(){ console.log(this); } global_function();//2番目のthis、windowを指す
ルール3:メソッド呼び出しにおいて、thisはメソッドが呼ばれたインスタンスを指す
じゃあ次にこれは?というとここでのthisはObject {method1: function}となる。ここら辺までは想定の範囲内。
var obj = { method1:function (){ console.log(this); } } obj.method1();//3番目のthis、上のobjを指す
ルール4:入れ子になった関数において、thisはwindowを指す
これはだいぶ意味不明なんだが、そういうもんとして覚えるしかなさそう。thisにおいてスコープチェーン的な考え方は通用しない。
var obj = { method1:function (){ var method2=function(){ console.log(this); } method2(); } } obj.method1();//4番目のthis、windowを指す
ルール5:これらルールに基づき、thisが何を指し示すかは処理の"実行時"に決定する
以下のコードでglobal_functionは2回呼ばれているが、全く同じ処理であるにも関わらずそれぞれの指し示すthisはその関数が呼ばれる状況によって異なっている。(=thisは実行時に決定される)
function global_function(){ console.log(this); } global_function();//2番目のthis、windowを指す var obj = {} obj.method2 = global_function; obj.method2();//4番目のthis、上のobjを指す
だいぶお腹いっぱいになってきたので今日はこのへんで。
依然として今後の課題
- Apply関数って何?→thisをコントロールするためのものらしい
- (function() {})();とかいう記法→即時関数というらしい
thisのスコープの考え方