◆再帰に使うくらい?

JavaScriptでよくやる関数の書き方がこんなのです
function a(){ }
関数を作る構文です

ちょっと変わってますがこうもできます
var a = function(){ }
これは関数リテラルで無名関数を作って変数aに代入する式です
無名関数にも名前はつけることができます
var a = function a(){ }
あまり意味は無いですが再帰させるときに便利です

例えば
var a = function(){console.log(a)} a() var b = a b() // bではなくaが表示される a = 100 b() // aが100になったので100が表示される
結果
function (){console.log(a)}
function (){console.log(a)}
100
コメントどおりですが「a」を出力しているのでaが変わると結果が変わってしまいます
再帰関数にするためa()としていたならaが100になったら関数を実行できないエラーです


無名関数に名前をつけてその名前を関数内で呼べば 変数名を変えられても問題なく再帰関数が実行できます
var a = function z(){console.log(z)} b = a a = 10 b()
結果
function z(){console.log(z)}

絶対に大丈夫?

JavaScriptでは
function a(){     console.log("1回実行しました");     a = function(){console.log("この関数は1回だけ実行できます")} } a() a()
結果
1回実行しました
この関数は1回だけ実行できます

として自分自身を書き換えて2回目からの関数の実行結果を変えれます
ですが 無名関数の名前は変更できないのでこの点では安心して再帰関数を使えます

といってもvarでローカル変数に同じ名前を使われるともうダメなんですけどね

varを使っても大丈夫でミスで上書きしてしまうこともなさそうなarguments.calleeという自分自身が入った変数が関数実行時に作られるのですが arguments を使うと動作が遅くなるらしいです
そんなわけで普段は無名関数に名前つけて再帰時に呼び出せばいいんじゃないかなと思います


ところでこういう場合は大丈夫
function sample(){     function a(){         console.log(a)     }     test(a) } function test(fn){     fn() } sample()
testに関数aを渡してtestの中で実行しています
testの中にaはないですがJavaScriptの関数内のスコープは関数が作られた場所依存なのでsampleの中の関数aを見ることができます

逆に↓はzが無いってエラーになります
function sample(){     function a(){         console.log(z)     }     test(a) } function test(fn){     var z = 100     fn() } sample()