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と同じ
:
}