this4パターン

thisとは

thisとは関数を実行した時に関数に渡されるもので0番目の引数と理解すると簡単です
thisに何が渡るのかは全部で4パターンあるので覚えてしまいましょう

1. オブジェクトが関数についている時 (メソッド)

何か.関数(1番目の引数);
あれか.何か.関数(1番目の引数);

左にオブジェクトが付いている関数を実行した時。 this はすぐ左についているオブジェクトになります
上記の例だと両方とも「何か」が this に渡ります

//上記の式を変形すると
関数(何か, 1番目の引数);
関数(あれか.何か, 1番目の引数);

このように変形すると「何か」が0番目の引数として関数に渡されるのがイメージできるかと思います。
変形前の例は「オブジェクト指向風」、変形後の例は「関数風」で本質的に意味は同じです

2. 関数に何もついていない時

関数(1番目の引数);

関数に何も付けずに実行した時は、this は「window」になります。仕様です

3. 関数にnewがついている時

var 何か = new 関数(1番目の引数);

関数にnewを付けて実行した時は「空のオブジェクト{}」が this に渡ります
そしてその関数は自動的に this を返却してきます

4. 関数にcall/apply/bindがついている時

マニアックなので覚える必要はないです

関数.call(0番目の引数, 1番目の引数, 2番目の引数);
関数.apply(0番目の引数, [1番目の引数, 2番目の引数]);

関数に call() や apply() を付けると「0番目の引数」を this に代入してその関数を実行します

call と apply は引数の渡し方が違うだけで他は同じです

var 新関数 = 関数.bind(0番目の引数, 1番目の引数, 2番目の引数);

関数に bind() を付けると「0番目の引数」を this に代入した新関数を返します
この新関数を実行すると、常に this は「0番目の引数」になります

関数.bind(); という式は function(){}.bind(); のように書くこともできます

その他の仕様

argumentsとセットで覚えよう

arguments が「関数に渡される1~n番目の引数」なのは分かると思います。
this も同じことで「関数に渡される0番目の引数」になります

どちらも関数が実行される度に生成されるローカル変数です