Re:JavaScriptに自信があるならこのクイズを受けてみるといい!vol.2

http://www.ideaxidea.com/archives/2010/02/js_quiz.html

昨日に引き続き第2問、かなりめんどくさくなってきてます。でも頑張る。

第2問

var f = function g(){ return 23; };
typeof g();

  1. “number”
  2. “undefined”
  3. “function”
  4. Error
回答

4.Errorが正解

解説

JavaScriptには関数リテラルという式があります。

var func = function(){alert('foo')}; // <1>普通の無名関数
var func2 = function func3(){alert('bar')}; // <2>関数リテラルにfunc3という名前を付ける

func(); // foo
func2(); // bar
func3(); // Error

ほとんどの場合<1>のようにして無名関数を作るのに使いますが、<2>のように、関数リテラルに名前を付けることも出来ます。ところが、このfunc3は、その関数の外側から参照することはできません。

ではfunc3はどういう時に使うのかというと、これはfunc3という名前を付けられた関数の内部で、自分自身を呼び出す再帰的な関数を作るときに使えます。

以下のサイトを参考にしました。
http://d.hatena.ne.jp/vividcode/20090711/1247315714

追記(2010.2.18)

functionの内部では、arguments.calleeというプロパティで自分自身への参照を取得できる。
これがあるから個人的には関数リテラルにあえて名前を付ける動機が無いなぁと思ったり。