おれの技術日記

元はJava+SQLがメインのエンジニア、フロントエンドは軽くかじった程度で苦手。最近忘れっぽいので覚えたことをいろいろメモするためにブログ開始。

JavaScript再入門3 - thisは何を意味するか

JavaScript再入門2 - おれの技術日記の続き。

例によってこちらにお世話になります。
最強オブジェクト指向言語 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を指す

だいぶお腹いっぱいになってきたので今日はこのへんで。

依然として今後の課題

  1. Apply関数って何?→thisをコントロールするためのものらしい
  2. (function() {})();とかいう記法→即時関数というらしい
  3. thisのスコープの考え方