• ベストアンサー

関数の呼び出し時の引数について(JavaScript)

function MyFunc(arg1, arg2) { } 上記のようなJavaScript関数で、MyFunc(1, 2)と呼び出さずに MyFunc(1)と呼び出しても、正常に実行されますが(とりあえずIEでは)、 これは保証された動作なのでしょうか? またJavaScriptの関数はオーバーロードを使用できるものと 思ってもよいでしょうか? お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

javascript では、 必要な個数より多い引数が渡された場合、余分な引数は無視されます。 必要な個数より少ない引数が渡された場合、未定義値とみなされます。 これは、保証された動作ですが、 arg2 が未定義値であるかどうかは、当然関数側で調べなければなりません。 また、実際に引数として定義した個数に関係なく、 引き渡された実際の引数をarguments[ ]で操作することができます。 このことは、不定長の個数の引数の関数を簡単に作れることを意味します。 javascript の関数(メソッド)は、オーバーロードできますが、 この場合の引数が違う関数というのは、元の関数をオーバーロードしているわけではありません。

nihon_no_samurai
質問者

お礼

ありがとうございます!勉強になりました。

その他の回答 (6)

  • Blaise
  • ベストアンサー率33% (13/39)
回答No.7

No.5へのコメント たわけたことをいった覚えはまったくありません。 ECMA262が「仕様」だとははじめて聞きました。少なくとも、 JavaScriptの標準規格でしょう。 Netscape CommunicationsとMicrosoftの間でJavaScriptの 仕様が微妙に異なっていたため、両社が参加の上、ECMAが標準化したものが標準化規格であるECMAじゃないのですか。たとえば、allはIEの独自仕様だし、NN4などはその仕様 の独自仕様のゆえに未だにプログラマを悩ませています。 仕様というのは規格とはまったくちがいます。 そうした各社の仕様のもとにJavaScriptを動かしているので、 互換性の問題が発生しているわけです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

>現在のところWindowsだけといってもいいでしょう。 ? Firefox でも動くよ

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.5

さて、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)
回答No.4

たしかに、JavaScriptでそれが動くとしても、所詮は仕様 です。また、引数の数の不一致でargumentsを使えば、配 列として参照することも可能ですが、それが問題なく動く のは、現在のところWindowsだけといってもいいでしょう。 MacのIE5,IE6では、argumentsオブジェクトは通じません し、UNIXにいたっては、IEは全滅です。 なので、できるだけ多くのユーザーを対象としたプログラ ミングをするならば、変則的なコードは控えるべきだと思 うわけです。

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

> またJavaScriptの関数はオーバーロードを使用できるものと思ってもよいでしょうか? オーバーロードそのものはできませんが、オーバーロードしているように見せかけることはできます。 つまり、呼び出された関数の中で実際の引数の数や種類を調べてそれに応じて処理を変えるということをするのです。

nihon_no_samurai
質問者

お礼

なるほど、ありがとうございます!

  • Blaise
  • ベストアンサー率33% (13/39)
回答No.1

たしかにそういう現象はありますよね。あたかも、第2 引数を無視したかのように動作する。しかし、それはた またま運がよかったというくらいの話でしょ。厳密な解 釈をすればエラーになって当然です。 気持ちのいい書き方ではないし、関数の引数はきちんと 渡すべきです。私にはこわくて書けませんw

nihon_no_samurai
質問者

お礼

ありがとう!

関連するQ&A

  • javascript 初心者です 関数について

    javascript 初心者です。 下記のスクリプトでmyFunc()の部分に引数をつかって、 function myFunc(arg){ document.arg.src = "pic_b.jpg"; } <p onclick="myFunc('stage')">Bに入れ替え</p> のようにしたいのですが、うまくいきません…。 正しいスクリプトを教えてください。 よろしくお願いします。 <html> <head> <script type="text/javascript"> <!-- function myFunc(){ document.stage.src = "pic_b.jpg"; } --> </script> </head> <body> <p onclick="myFunc()">Bに入れ替え</p> <img src="pic_a.jpg" name="stage"> </body> </html>

  • 関数の引数のデフォルト値について

    PHP5.2.4を使用しています。 自作関数で、例えば数値や文字列を受け取る引数のデフォルト値を 「''」で入力されてないかをチェックする場合と、 「NULL」で入力されてないかをチェックする場合とでは、 どちらが良いというのはあるのでしょうか? function a($arg = '') {  if($arg == '')  {  } } //または function a($arg = NULL) {  if(is_null($arg))  {  } }

    • ベストアンサー
    • PHP
  • OpenOffice Basicで引数を2つ利用する関数が作れません

    OpenOffice Basicで引数を2つ利用する関数が作れません Open Office Calc 3.1.1を使っています。 できれば複数(3つ以上)引数を取る関数を作りたいのですが、 2つ引数を取ろうとすると演算結果が#NAME?になってしまいます。 切り分けにシンプルな関数を作ってみました。 以下で=test2(3,5)とすると結果が#NAME?になります。 Function test2(arg1 As Integer, arg2 As Integer) as Integer test2 = 3 + arg2 End Function #なお、関数内の演算内容はtest2 = arg1 + arg2でも変わらず#NAME?です 切り分けで以下を作ると=test3(3)で6が返されます Function test3(arg1 As Integer) as Integer test3 = 3 + arg1 End Function 関数名のタイプミスの可能性を排除するために、 test2関数を名前を換えずに引数の数を1つに変更してみると 計算できるのでタイプミスではないと思います。 やはり引数を複数とる取り方に問題があるように見えます。 お手数ですが何かアドバイスいただけないでしょうか?

  • 関数名をテキストから読み込む方法(文字列比較無し)

    C言語にて開発を行っています。 今回、テキストファイルに記述された関数名および引数を読み取り、プログラム側でこれを実行する処理を実装しようと考えています。 その際、テキストから読み込んだ文字列によって処理を振り分けることを省略したいと思っていますが方法が分からず困っています。 以下が読み取る対象のテキストファイルの例です。 @function_A;arg1;arg2 @function_B;arg1;arg2 ・・・ このとき、テキストファイルから読み取った文字列に応じた関数を実行する、というところまでは実装できています。 (読み取った文字列がfunction_Aであれば、同名の関数を実行します) 現在の実装は、以下のようなイメージです。 command = "読み取った文字列(@function_Aなど)"; if(command == "@function_A"){ function_A(arg1, arg2);} else if(command == "@function_B"){ function_B(arg1, arg2);} ・・・ しかし、この実装では関数が増えるに従って if(command == "function_X"){...}をどんどん追記していく必要があります。 今後関数の数が膨大になっていく予定なので、これを追記せずに読み込んだ文字列と同名の関数を実行できるようにしたいと思っています。 以下の様なイメージです。 function_A.cというファイルに関数function_A(arg1, arg2)を実装します。 同様にして、 function_B.cに関数function_B(arg1, arg2)を実装します。 main()内にて、 char command[] = "読み取った文字列(function_Aなど)"; command(arg1, arg2); とすることによって、function_A()関数を実行できるようにすることが目的です。 もちろん、この場合のcommandはchar型ですから、上記のような記法が不可能なことは分かっていますが、似たようなことを実装したいと思っています。 どのようにすれば実装できるのでしょうか。 今後、関数の数だけfunction_A.cのようなファイルが増え、最終的に200近くになる予定ですし、 if(command == "@function_A"){ function_A(arg1, arg2);} else if(command == "@function_B"){ function_B(arg1, arg2);} ・・・ の記述忘れによる動作不良を防ぐためにもこれを実装したいと思います。

  • javascript関数呼び出し時の()について

    javascript関数呼び出し時に、 a関数があるとき、 a()をつけることで ・戻り値を代入するという意味になるということ ・関数自体を代入していますので、a関数を実行した戻り値を代入する ということを教えて頂きました。 また、()がないとき、aとした場合、 ・関数の登録だけがされる  ということを教えて頂きました。 (http://okwave.jp/qa/q7383010.html) しかし、以下ソースの場合、onclickには、 関数名pushを[onclick="push"]ではなく、[onclick="push()"]と記述しないと 正しく動作しませんでした。 私的には、 onclickには、「push関数を登録してクリックされたときにだけ動作させる = push だけでいいのではないのか?」 と考え、[onclick="push"][onclick="push()"]の二つのボタンを用意したのですが、 push()ボタン しか 正常に動作しませんでした。 なぜなのでしょうか? ()なしの、関数の登録だけがされる という内容を私は間違って捉えてしまっているのでしょうか。 ご教授お願いします。 以下ソース <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <script type="text/javascript"> <!-- function push(){ alert('ボタンが押されました'); } --> </script> <title>簡単実験</title> </head> <body> <h1>関数実験</h1> <hr> <input type="button" value="()ありボタン" onclick="push()"> <input type="button" value="()なしボタン" onclick="push"> </body> </html>

  • 関数を呼んだら、その中の関数も自動実行される?

    ・関数の実行タイミングが分からないので教えてください ・下記で、どうして引数が渡るのでしょうか? ・portal関数を呼んだら、gooプロパティに無名関数が格納される(?)と思うのですが、=関数実行になるのでしょうか? ・無名関数だから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);  } } obj.portal("あ"); ・自分的には、portal関数を呼んで変数gooに無名関数を格納(?)した後、明示的にgoo();と呼ぶ必要があると思うのですが… ・下記でTypeErrorエラーになるのは、gooプロパティが2回呼ばれるから? ・明示的に呼んだ2回目は引数が渡らないから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);   goo();  } } obj.portal("あ"); //TypeError: undefined is not a function

  • JavaScriptで関数設定時に引数を指定したい

    状況を説明します ・複数のthにoncklickイベントで同じ関数を呼びたい ・th要素のタグにonclick属性を書くのは同じ記述をたくさん書くことになるのでやりたくない ・JavaScriptでonclick属性に関数を設定したい ・th要素自身を引数としたい ※WindowsXPのIE8で動けばOKです。 (0)ベタ書きするとこんな感じになります。これなら動くことを確認しています。 # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # # function func1(th) { #   … # } (1)引数がなければこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = func1; # } (2)無名関数ならこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = function() { #     … #   } # } しかしこの2つの書き方「(1)(2)」とも、引数を入れようとしたところ どうすればいいかわかりませんでした。 上記の状況を踏まえ… 質問は以下です ・(1)のような書き方で、引数アリの関数を設定する方法 ・(2)のような書き方で、引数アリの関数を無名関数で設定する方法 ・それ以外の代替方法 これを教えてください。 そもそもJavaScriptではできないのであればその旨を教えてください。 よろしくお願いします。

  • オブジェクトの中で呼び出される順番とデフォ引数?

    ・意味が分からないコードがあるので教えてください ■コード var arg; var obj = {  hoge : function( arg ) {   var hoge = function(arg){    return function() {    }   }(arg);   hoge();  } } ■質問 ・この時、obj.hoge(arg);と書いたら、どういう処理が走るのでしょうか? ・初めに実行されるのは? 無名関数部分? それともhoge()? ・hoge()を実行する際、引数指定していないので、引数は渡らない?

  • javascript 初心者です 引数と変数について

    下記のスクリプトで○と×交互に表示されるようにしたいのですが、 hensu = !hensu;のところがうまく機能してくれません。 i = !i;だとうまくいくのですが、引数を使いたいです。 どのように記述すればよいのでしょうか? よろしくお願いします。 <html> <head> <script type="text/javascript"> <!-- i = true; function myFunc(hensu){ if(hensu){ alert("○"); } else{ alert("×"); } hensu = !hensu; } --> </script> </head> <body> <p onclick="myFunc(i)">[btn]</p> </body> </html>

  • JavaScript 関数名

    ただいま、JavaScriptの参考書を読みながら、フォームのボタンがクリックされると、 新しいウィンドウで別のページを開くといった簡単なものを書いているところなのですが、 function 関数名(){処理内容}の関数名をclickとして、ボタンがクリックされたらonclick="click()"で関数が呼び出されるようにしたのですが、上手く動作しません。 色々と試していくうちに、関数名を変えると、(例えばaだとか)動作することがわかりました。 関数名をclickとする場合だけ上手く動作しないのはなぜでしょうか? 関数名の付け方のルールも守っているように思うのですが… (名前の入力ミスとかではありません。)

専門家に質問してみよう