引数オブジェクト
関数コードでは、特別なオブジェクト引数を使用することで、開発者は明示的に名前を付けずにパラメータ名にアクセスできます。
たとえば、関数sayHi()では、最初のパラメータはmessageです。この値は、最初の引数の値である argument[0] を使用してアクセスすることもできます (最初の引数は位置 0、2 番目の引数は位置 1 など)。
したがって、パラメータに明示的に名前を付けなくても関数を書き直すことができます。
function sayHi() { if (arguments[0] == "bye") { return; } alert(arguments[0]); }
検出パラメータの数
arguments オブジェクトを使用して関数のパラメータの数を検出することもできます。プロパティ argument.length を参照するだけです。
次のコードは、各関数呼び出しで使用されるパラメーターの数を出力します。
function howManyArgs() { alert(arguments.length); } howManyArgs("string", 45); howManyArgs(); howManyArgs(12);
上記のコードは「2」「0」「1」を順番に表示します。
注: 他のプログラミング言語とは異なり、ECMAScript は関数に渡されるパラメーターの数が関数で定義されたパラメーターの数と等しいかどうかを検証しません。開発者定義の関数は、エラーを発生させることなく、任意の数の引数 (Netscape のドキュメントによると最大 255 個) を受け入れることができます。不足している引数は未定義として関数に渡され、余分な関数は無視されます。
関数のオーバーロードをシミュレートします
引数オブジェクトを使用して、関数に渡されるパラメーターの数を決定し、関数のオーバーロードをシミュレートします。
function doAdd() { if(arguments.length == 1) { alert(arguments[0] + 5); } else if(arguments.length == 2) { alert(arguments[0] + arguments[1]); } }
doAdd(10); //「15」を出力します
doAdd(40, 20) //「60」を出力します
パラメータが 1 つだけの場合、doAdd() 関数はパラメータに 5 を加えます。パラメータが 2 つある場合は、2 つのパラメータが加算され、その合計が返されます。したがって、doAdd(10) は「15」を出力し、doAdd(40, 20) は「60」を出力します。
オーバーロードほど良くはありませんが、ECMAScript のこの制限を回避するには十分です。