関数の呼び出し


「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がグローバルスコープを指す)のは設計ミスだと指摘されていました。本来なら呼び出しもとの関数を指しべきだと。