スタートページJavascript関数への引数渡し

可変個引数


例1:引数の個数が異なるときの処理

3個の数値を加える関数「加算関数」を想定します。

    function 加算関数(引数1, 引数2, 引数3) {
      var 合計 = 引数1 + 引数2 + 引数3;
      return 合計;
    }

呼出し側の引数個数により、次の結果になります。

(注意)実関数がないことの確認方法

ケース3で、引数3がないときはデフォルト値を用いるという使いかたがあります。それには
    if (引数3 == null) 引数3 = デフォルト値;
とします。
 alert(引数3); とすると ubdefined と表示されますが、if (引数3 == "undefined") としたのでは正しく処理されません。if (引数3 == "") としてもダメです。

    function 加算関数(引数1, 引数2, 引数3) {
        var 合計 = 引数1 + 引数2 + 引数3;
        return 合計;
    }
    function 例1() {
        var 答;
        答 = 加算関数(10, 20, 30);      // 引数が3個
          alert("ケース1:答 = " + 答);
        答 = 加算関数(10, 20, 30, 40);  // 引数が4個
          alert("ケース2:答 = " + 答);
        答 = 加算関数(10, 20);          // 引数が2個
          alert("ケース3:答 = " + 答);
    }

ケース4は実行されない

 

例2:argumentsオブジェクトによる可変個引数の実現

組み込み関数のなかには、
    Marh.max(30, 50, 10);
    Marh.max(30, 50, 10, 20, 40);
のように、引数の個数が任意な関数があります。

次のプログラムの「最大関数() 」は、Marh.max() と同じ機能を実現したものです。
 [実行」ボタンをクリックすると、関数「例1」が起動し、
    最大値 = 最大関数(30, 50, 10, 20, 40);
により、最大値である「50」が表示されます。

    function 最大関数() {
        var 最大値 = Number.NEGATIVE_INFINITY;        //  行C
        var 引数要素数 = arguments.length;            //  行B
        for (var i = 0; i < 引数要素数; i++) {
            var 引数要素値 = arguments[i];            //  行A
            if (引数要素値 > 最大値) 最大値 = 引数要素値;
        }
        return 最大値;
    }

    function 例2() {
        最大値 = 最大関数(30, 50, 10, 20, 40); 
        alert(最大値);
    }

50が表示される

これを実現しているのがargumentsオブジェクトです。
 「最大関数」には仮引数がない(0個)のですが、呼び出されると、呼出し側の関数「例1」で与えた実引数が、自動的に配列 arguments[i] に入り(行A)、その要素数(実引数の個数)が arguments.length に入ります(行B)。
 この例では、
    arguments[0] = 30, arguments[1] = 50, … , arguments[4] = 40
    arguments.length = 5
となります。
 (なお、行Cの Number.NEGATIVE_INFINITY は、Javascriptで表現できる最小の値(負の無限大に相当)を与えるものです。最大値は Number.POSITIVE_INFINITY です。)

例3:複数の戻り値

関数から、呼出側に一つの変数 x を戻すには、
   関数側では return x;
   呼出側では、var a = 関数();
としますが、複数の戻し値がある場合は、次の二つの形式があります。変数は、スカラーでも配列でも構いません。

形式A:順序で渡す
  関数側
   return [ 変数0, 変数1, … , 変数N ];
  呼出側
   var 戻り値 = 関数();
   var 変数A = 戻り値[0];
   var 変数B = 戻り値[1];
     :   // 必要なものだけ記述すればよい
   var 変数N = 戻り値[n];

形式B:名称で渡す(個数が多く順番を覚えるのが面倒なとき)
  関数側
   return { 名称0:変数0, 名称0:変数1, … , 名称0:変数N };
  呼出側
   var 戻り値 = 関数();
   var 変数A = 戻り値.名称0;
   var 変数B = 戻り値.名称1;
     :   // 必要なものだけ記述すればよい
   var 変数N = 戻り値.名称N;

例3A

function 関数3A() {
    var スカラー = "s";
    var 一次元配列 = [ "a", "b", "c" ];
    var 二次元配列 = [
             [ 0,  1,  2 ],
             [10, 11, 12 ]
        ];
    return [スカラー, 一次元配列, 二次元配列];  // [ ] で囲む
}

function 例3A() {
    var 戻り値 = 関数3A();
    var 変数X = 戻り値[0];
    var 変数Y = 戻り値[1];
    var 変数Z = 戻り値[2];
    var Y件数 = 変数Y.length;
    var Z行数 = 変数Z.length;
    var Z列数 = 変数Z[0].length;
    var 結果 = "変数X:" + 変数X + "<br>";
    結果 += "変数Y" + "<br>";
    for (var i = 0; i < Y件数; i++) {
        結果 += " 変数Y[" + i + "]=" + 変数Y[i];
    }
    結果 += "<br>";
    結果 += "変数Z<br>";    
    for (i = 0; i < Z行数; i++) {
        for (var j = 0; j < Z列数; j++) {
            結果 += " 変数Z[" + i + "][" + j + "]=" + 変数Z[i][j];
        }
        結果 += "<br>";
    }
    document.getElementById("3A表示場所").innerHTML = 結果;
}

例3B

function 関数3B() {
       :
       :  // 関数3Aと同じ
       :
    return { "x":スカラー, "y":一次元配列, "z":二次元配列 };  // { } で囲む
}

function 例3B() {
    var 戻り値 = 関数3A();
    var 変数X = 戻り値.x;
    var 変数Y = 戻り値.y;
    var 変数Z = 戻り値.z;
       :
       :  // 例3Aと同じ
       :
}