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(); のように書くこともできます
その他の仕様
- 関数の外では this は window になります
- this 自体は定数です
argumentsとセットで覚えよう
arguments が「関数に渡される1~n番目の引数」なのは分かると思います。
this も同じことで「関数に渡される0番目の引数」になります
どちらも関数が実行される度に生成されるローカル変数です