jquery JavaScript の引数

2013年5月1日

  • JavaScriptは引数のデータ型をチェックしないので引数のデータ型を確認するには、typeof()演算子でチェックする。
  • JavaScriptは引数の個数もチェックしない。必要な個数より多かった場合、余分な値は無視され、少なかった場合はその部分の値は 未定義値とみなされ、関数の振る舞いがおかしくなる可能性がある。
  • 関数は任意の個数の引数を使って呼び出せる。関数を定義したときに記述した引数の数と同じ数である必要はない。

省略可能な引数

引数が省略された場合(もしくはnullが指定された場合)に、省略された引数に適切なデフォルト値が設定されるようにしなければならない。

省略可能な引数を持つ関数を定義する場合、省略可能な引数は引数リストの最後に記述する。

function func(o, a){
  a = a || '';  //未定義値またはnullの場合は、空の文字列を設定
  ...
}

可変長の引数リスト(Argumentsオブジェクト)

  • 関数に渡された引数値は arguments[] 配列の要素に格納され、数値インデックスで参照できる。
  • arguments は Arguments オブジェクトを参照する特別なプロパティ。
  • Arguments オブジェクトには callee プロパティが存在する。
  • Arguments オブジェクトは「配列のような」オブジェクトで呼び出し時に渡された引数の個数は arguments.length で参照可能。
//引数の個数が正しいかをチェックする例
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と表示

calleeプロパティ

  • callee プロパティは現在実行中の関数を参照する。
  • callee プロパティは呼び出された関数そのものへの参照を取得できる。
  • this キーワードは現在実行している関数を参照するものではないので、 関数本体の内部でその関数を参照するには callee プロパティを使用する。
  • callee はすべての関数オブジェクト内で利用できるローカル変数 arguments のプロパティ。
  • 再帰的に呼び出す匿名関数では関数名を使って関数を呼び出せないため arguments.callee プロパティの値を使う。
//再帰的に呼び出す関数の例(階乗を求める)
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);