引数が省略された場合(もしくはnullが指定された場合)に、省略された引数に適切なデフォルト値が設定されるようにしなければならない。
省略可能な引数を持つ関数を定義する場合、省略可能な引数は引数リストの最後に記述する。
function func(o, a){
a = a || ''; //未定義値またはnullの場合は、空の文字列を設定
...
}
//引数の個数が正しいかをチェックする例
function func(x,y,z){
if(arguments.length != 3){
throw new Error("関数 func は" + arguments.length +
"個の引数で呼び出されましたが、引数は 3つ必要です。");
}
//チェックが終了してからの処理
}
//任意個の引数を受け取って最大の引数値を返す例
function max_aug(){
var m = Number.NEGATIVE_INFINITY;
for(var i=0; i<arguments.length; i++){
if(!isNaN(arguments[i])) {
if(arguments[i] > m) m = arguments[i];
}else{
throw new Error('数値ではありません。' + arguments[i]);
}
}
return m;
}
document.write(max_aug(10, 333, 108, 6666,77)); //6666と表示
//再帰的に呼び出す関数の例(階乗を求める)
function factorial(x){
if(x > 0 ){ return x * arguments.callee(x-1); }
return 1;
}
上記の場合、return x * factorial(x-1); でも可能だが、元の関数名が変更された場合、関数本体の記述も修正しなければならない。
//再帰的に呼び出す匿名関数
function(x){
if(x <= 1) return 1;
return x * arguments.callee(x-1);
}
以下のような場合、第1引数をデフォルトに(省略)して第2引数のみを指定することはできない。
(第1引数を指定して、第2引数をデフォルトに(省略)することは可能。)
function sq(width, height) {
width = width || 10;
height = height || 10;
return width * height;
}
引数にオブジェクトを使用することで、引数の順番を自由に変更することが可能。
function sq(args) {
width = args.width || 10; //未定義値またはnullの場合は、デフォルトを設定
height = args.height || 10;
return width * height;
}
alert(sq({height: 2}));
alert(sq({height: 6, width: 5}));
関数はデータ型の一種なので、関数そのものも他の数値型や文字列型と同様に関数の引数として渡したり、戻り値とすることができる。
function serial_alert(data, func) {
for(var key in data) {
func(key + ':' + data[key]);
}
}
function func(str) {
alert(str);
}
serial_alert(['java', 'php', 'perl'], func);