Subscribed unsubscribe Subscribe Subscribe

argumentsオブジェクトと可変長引数関数

Callオブジェクトの説明のところで割愛したargumentsオブジェクトについて。argumentsオブジェクトは実行されている関数に渡された引数が要素に入った配列の"ような"ものです。arguments[i]はi番目の引数を返し、arguments.lengthは引数の個数を返します。なので

function varargs(){
  for(var i = 0;i < arguments.length; i++){
    console.log(arguments[i]);
  }
}

varargs('hoge', 'foo', 'bar', 'fuga', 'piyo');

とするとかっちり全部の引数を出力します。注目してほしいのはvarargs()が引数を取るとは宣言されてないところですね。こういうのを可変長引数関数というそうです*1
ちなみに上記コードをfor/inで書き直して

function varargs(){
  for(var i in arguments){
    console.log(arguments[i]);
  }
}

varargs('hoge', 'foo', 'bar', 'fuga', 'piyo');

とやっても何も出ません。しかも、argumentsオブジェクトはarguments.lengthで引数の個数を返しますが、関数の引数以外のプロパティも持ってます。この辺が普通の配列とは違うところ。
で、引数以外に持ってるプロパティが callee プロパティ。これは実行されている関数自身を指します。無名関数で再帰関数を作るときなどに必要とされます。

まぁいろいろ使い方によっては便利に使えるかもしれません。

【参考】
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Functions/arguments

*1:オライリー第5版によれば