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は実行されない
組み込み関数のなかには、
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 です。)
関数から、呼出側に一つの変数 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;
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 = 結果; }
function 関数3B() { : : // 関数3Aと同じ : return { "x":スカラー, "y":一次元配列, "z":二次元配列 }; // { } で囲む } function 例3B() { var 戻り値 = 関数3A(); var 変数X = 戻り値.x; var 変数Y = 戻り値.y; var 変数Z = 戻り値.z; : : // 例3Aと同じ : }