Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

javascriptの関数で可変長の引数を扱う

functionで可変長変数を扱いたい場合、ベタな方法としては……最初から受け取る変数を配列として設計してあげる方法がありますね。
他にも、通常の引数のように渡す方法や、後で配列形式の変数を渡す方法があります。

実際のところ

渡した数値の平均を出す……という単純な関数を考えます。

都度与える数が分かっている場合

関数に与えられた引数は関数内のローカル変数arguments*1に格納されます。
それにしても、Javascriptはforの初期化で二個の変数を一気に定義できるんですね……知りませんでした。

function avg() {
  var sum = 0;
  for (var i = 0, j = arguments.length; i < j; i++) {
    sum += arguments[i];
  }
  return sum / arguments.length;
}

test = avg(2, 3, 4, 5); // 3.5
console.log(test);

与える数すら不明確な場合はFunction#apply()を使う

とはいえ……そもそも変数の数は全く予想がつかないケースも想定されますよね。
そういう場合はFunction#apply()がイケます。
これは既存の関数に対して、配列を渡してあげるとargumentsとして取り扱ってくれる便利メソッドです。
第一引数の"this"は呼び出し先の関数を示します。*2

// 略
test = avg.apply(this,[2, 3]); // 2.5
console.log(test);

*1:配列っぽい挙動をしますが、厳密には違うものです。そのうち記事にします

*2:non-strictモードではnullにすることでグローバル変数としてセットされ初期値は保存される……とか書いてあるのですが、ぶっちゃけ意味が分からないのでstrictモードでも動くthisにしてます。