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