ECMAScript / ECMA-262 Edition 5.1ベースのJavaScript文法
// 引数を1つだけ持つ関数のはずなのに・・・
function arg_list_samp ( obj )
{
/*
突然 argments オブジェクトが現れても
何事もなかったかのように処理される
*/
var len_num = argments.length
var arg1 = argments [0]
var arg2 = argments [1]
var arg3 = argments [2]
}
/*
その結果、本来、引数を1つしか取らない
関数であってもこんなことができたりする
*/
arg_list_samp ( "pc" , "mobile" , "paper" ) ;
argments オブジェクトは、インスタンス生成時に本来の引数に関わらず、引数を"argments"とすると可変個の引数を取る関数・メソッドとすることができたり、任意の関数内で何の宣言もせずに argments.length プロパティや添え字 0 から始まる argments[n] を参照することが可能である特殊なオブジェクトです。
つまり、argments オブジェクトの特徴は、インスタンス生成時は引数ともなることがあるものの、宣言も不要で唐突に関数内で参照することができる全ての関数内で利用可能なローカル変数であることです。
よってargments オブジェクトは、Globalオブジェクトを始めとする他のオブジェクトとは異質のオブジェクトであり、Arrayオブジェクトと似た要素が0から始まる配列・リストで lengthプロパティを持つ点も似てはいますが、それ以外のArrayオブジェクトが持つメソッド含むプロパティは持たないArrayオブジェクトとも異なるオブジェクトです。
argments オブジェクトのプロパティは、下記の通りです。
Arrayオブジェクトの標準組み込みプロパティ | |
---|---|
argments.length | 呼び出された際の実際の引数の数 任意の関数で宣言時に指定された引数の個数は、 func.prototype.length |
argments.callee | 現在実行中の関数へのリファレンス(参照) |
argments.caller | 現在実行中の関数を呼び出した関数へのリファレンス(参照) |