- ベストアンサー
関数の呼び出し時の引数について(JavaScript)
function MyFunc(arg1, arg2) { } 上記のようなJavaScript関数で、MyFunc(1, 2)と呼び出さずに MyFunc(1)と呼び出しても、正常に実行されますが(とりあえずIEでは)、 これは保証された動作なのでしょうか? またJavaScriptの関数はオーバーロードを使用できるものと 思ってもよいでしょうか? お願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
javascript では、 必要な個数より多い引数が渡された場合、余分な引数は無視されます。 必要な個数より少ない引数が渡された場合、未定義値とみなされます。 これは、保証された動作ですが、 arg2 が未定義値であるかどうかは、当然関数側で調べなければなりません。 また、実際に引数として定義した個数に関係なく、 引き渡された実際の引数をarguments[ ]で操作することができます。 このことは、不定長の個数の引数の関数を簡単に作れることを意味します。 javascript の関数(メソッド)は、オーバーロードできますが、 この場合の引数が違う関数というのは、元の関数をオーバーロードしているわけではありません。
その他の回答 (6)
- Blaise
- ベストアンサー率33% (13/39)
No.5へのコメント たわけたことをいった覚えはまったくありません。 ECMA262が「仕様」だとははじめて聞きました。少なくとも、 JavaScriptの標準規格でしょう。 Netscape CommunicationsとMicrosoftの間でJavaScriptの 仕様が微妙に異なっていたため、両社が参加の上、ECMAが標準化したものが標準化規格であるECMAじゃないのですか。たとえば、allはIEの独自仕様だし、NN4などはその仕様 の独自仕様のゆえに未だにプログラマを悩ませています。 仕様というのは規格とはまったくちがいます。 そうした各社の仕様のもとにJavaScriptを動かしているので、 互換性の問題が発生しているわけです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>現在のところWindowsだけといってもいいでしょう。 ? Firefox でも動くよ
- UKY
- ベストアンサー率50% (604/1207)
さて、JavaScript の共通規格としての正式名称は ECMAScript といいます。仕様書は無料でダウンロードできます。参考までに URL をあげておきます。 原典 (英語) http://www.ecma-international.org/publications/standards/Ecma-262.htm 邦訳版 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/
- Blaise
- ベストアンサー率33% (13/39)
たしかに、JavaScriptでそれが動くとしても、所詮は仕様 です。また、引数の数の不一致でargumentsを使えば、配 列として参照することも可能ですが、それが問題なく動く のは、現在のところWindowsだけといってもいいでしょう。 MacのIE5,IE6では、argumentsオブジェクトは通じません し、UNIXにいたっては、IEは全滅です。 なので、できるだけ多くのユーザーを対象としたプログラ ミングをするならば、変則的なコードは控えるべきだと思 うわけです。
- UKY
- ベストアンサー率50% (604/1207)
> またJavaScriptの関数はオーバーロードを使用できるものと思ってもよいでしょうか? オーバーロードそのものはできませんが、オーバーロードしているように見せかけることはできます。 つまり、呼び出された関数の中で実際の引数の数や種類を調べてそれに応じて処理を変えるということをするのです。
お礼
なるほど、ありがとうございます!
- Blaise
- ベストアンサー率33% (13/39)
たしかにそういう現象はありますよね。あたかも、第2 引数を無視したかのように動作する。しかし、それはた またま運がよかったというくらいの話でしょ。厳密な解 釈をすればエラーになって当然です。 気持ちのいい書き方ではないし、関数の引数はきちんと 渡すべきです。私にはこわくて書けませんw
お礼
ありがとう!
お礼
ありがとうございます!勉強になりました。