function foo() {
	;
}

var obj = new Object();
obj.foo = foo;

var x = foo();
var y = new foo();
var z = obj.foo();

関数オブジェクトには 3 つの用途があることが分かった。

他の言語では、これらは独立していることが多いが、
JavaScript では、全て関数オブジェクトを利用する。
これらを区別するのは、その呼び出し方法である。

func() としてそのまま呼び出せば関数に、
new func() として呼び出せばコンストラクタに、
xxx.func() とプロパティとして呼び出せばメソッドとなる、

これら呼び出し方には、それぞれ役割がある。
コンストラクタは新しいオブジェクトの生成、
メソッドは、呼び出したオブジェクトに対する操作。
関数は、上記に当てはまらない、一般的な処理。

さて、呼び出される関数側の視点では、
上記のどの方法で呼び出されようが、
自身のコードが実行されるだけである。

しかし、呼び出し側の視点では、
それぞれの方法によって動作が変わる。
コンストラクタでは新しいオブジェクトが戻り、
関数やメソッドの呼び出しでは戻り値がそのまま戻る。

つまり、関数を呼び出す際には、JavaScript が介在し、
役割に応じて特別な処理を行っている。
まあ、当たり前だというと当たり前だ。

では、具体的に、どのような処理が裏で行われ、
それがどういう風に反映されるか、
コードだけでは見えない部分について考えていこう。