function invoke(func, x, y) {
    return func(x, y);
}

function foo(x, y) {
    return x * y;
}

foo.value = invoke(foo, 3, 5);

var bar = foo;

alert(bar.value);
alert(foo.toString());
alert(foo === bar);

JavaScript では、関数はオブジェクトの一種である。
関数は、通常のオブジェクトとしての特性に加え、
() 構文で「呼び出し可能」という特徴を持つ、
特別なオブジェクトとして扱われる。

JavaScript では、function キーワードを使うことで、
関数オブジェクトを作成することができる。

関数がオブジェクトであるということは、
プロパティを設定することも可能だし、
プロパティや変数に代入したり、
別の関数の引数として渡すことも可能なのだ。

上記の例では、invokefoo が関数オブジェクトだ。
言い方を変えると、invokefoo という変数があり、
それぞれに関数オブジェクトが代入されている。

途中で宣言している bar には foo が代入されるので、
変数 foobar は同一のオブジェクトを参照している。