JavaScriptでこけた

JavaScriptの関数定義でこけた

Javaから入ったので、柔軟なJavaScriptの文法にはこけてばっかりです
よく言えば柔軟。悪く言えば行儀が悪い文法ですね。
さて今日はJavaScriptの関数定義でこけました。


JavaScriptではJavaみたいに引数の異なる同じ名前の関数を定義できないようです(多重定義が使えない)
実際にテストしてみました。

 function a(){}
 function a(arg1){}
 function a(arg1,arg2){}

こんな風に書くと一番下の function a(arg1,arg2){}のみ有効になります。

例えばa()を呼び出してみるとします。
 a();

a()を呼び出しているのだから、当然function a(){}が呼ばれると思いますが、function a(arg1,arg2){}が呼ばれちゃいます。


arg1とarg2を渡していないのにfunction a(arg1,arg2){}が呼ばれるわけです。すごく混乱しますよね。
このときarg1とarg2の値はundefinedになります。

逆にこんな風に余計な引数をつけて呼び出しをしてみます
 a("引数1","引数2","引数3")

そうするとarg1には"引数1"が、arg2には"引数2"がそれぞれセットされ、
"引数3"という値は無視されます.

JavaScriptでの関数定義

JavaScriptでは引数の集合をarguments配列として扱っています
arguments[0]には一番目の引数が、
arguments[1]には二番目の引数が入っています
もちろん引数を渡さない場合でもarguments配列は渡されます

 a();

この場合、長さ0のarguments配列が渡されるわけです。

このarguments配列を利用することで、擬似的に多重定義ができます。

要するにargumentsの長さを調べて、それに応じた処理をしようということです。

詳しくはここの多重定義の項目を参照してください
http://chaichan.web.infoseek.co.jp/src/javascnew05.htm