「4.3関数の呼び出し」からのメモ。
ある関数が呼び出されたときその関数内でのthisの指し示すものは、関数の呼び出し方によって4つの場合がある。
- メソッド呼び出し
- 関数呼び出し
- コンストラクタ呼び出し
- apply呼び出し
メソッド呼び出し
オブジェクトのメソッドとして呼び出された場合、thisはそのオブジェクト自身を指す。
var obj = { name:"hoge", getName:function(){ return this.name; } }; alert(obj.getName()); //alert "hoge"
関数呼び出し
関数として呼び出された場合、thisはグローバルスコープを指す。これは注意が必要である。
var name = "hoge"; function getName() { var name = "foo"; return this.name; } alert(getName()); //alert "hoge";
関数内に定義された関数(内部関数)のthisもグローバルスコープを指す。これも注意が必要である。
var name = "hoge"; function getName() { var name = "foo"; function innerGetName() { return this.name; } return innerGetName(); } alert(getName()); //alert "hoge";
コンストラクタ呼び出し
コンストラクタとして呼び出された場合、thisは生成したオブジェクトを指す。
var Hoge = function(n) { this.name = n; alert(this.name); }; var h = new Hoge("hoge"); //alert("hoge");
apply呼び出し
javascriptの関数はオブジェクトであり、メソッドを持つことができる。
apply()メソッドを使うことでthisが指すオブジェクトを指定することができる。
var hoge = { name:"hoge", getName:function(){ return this.name; } }; var foo = { name:"foo" }; alert(hoge.getName.apply(foo)); //alert "foo"
4つのうち、関数呼び出しの場合のthisには気をつけないとハマりそうです。本にもこの仕様(thisがグローバルスコープを指す)のは設計ミスだと指摘されていました。本来なら呼び出しもとの関数を指しべきだと。