arguments
每天一对象,JS天天见,今天我们来看看arguments对象及属性。arguments对象不能显式创建,arguments对象只有函数开始时才可用。函数的 arguments 对象并不是一个数组,访问单个参数的方式与访问数组元素的方式相同。索引 n 实际上是 arguments 对象的 0…n 属性的其中一个参数。 下面的示例演示了 arguments 对象的用法,arguments对象和Function是分不开的。
1 function ArgTest(a, b) { 2 var i, s = "The ArgTest function expected "; 3 var numargs = arguments.length; // 获取被传递参数的数值。 4 var expargs = ArgTest.length; // 获取期望参数的数值。 5 if (expargs < 2) 6 s += expargs + " argument. "; 7 else 8 s += expargs + " arguments. "; 9 if (numargs < 2)10 s += numargs + " was passed.";11 else12 s += numargs + " were passed.";13 s += "\n\n"14 for (i =0 ; i < numargs; i++){ // 获取参数内容。15 s += " Arg " + i + " = " + arguments[i] + "\n";16 }17 return(s); // 返回参数列表。18}
以上是arguments对象,由于和Function对象紧密地联系在一起。也就是说每一个函数都有自己的argument属性。下面我们来看看argument属性:为当前执行的 function 对象返回一个arguments 对象,function 参数是当前执行函数的名称,可以省略。 通过 arguments 属性(相对于Function来说),函数可以处理可变数量的参数。arguments 对象的 length 属性包含了传递给函数的参数的数目。对于arguments 对象所包含的单个参数,其访问方法与数组中所包含的参数的访问方法相同。请看下面的例子: 1 function ArgTest() { 2 var i, s, numargs = arguments.length; 3 s = numargs; 4 if (numargs < 2) 5 s += " argument was passed to ArgTest. It was "; 6 else 7 s += " arguments were passed to ArgTest. They were " ; 8 for (i = 0; i < numargs; i++) 9 { 10 s += arguments[i] + " ";11 }12 return(s);13}
我们知道每一个对象都有自己的属性,arguments对象也不例外,首先arguments的访问犹如Array对象一样,用0到arguments.length-1来枚举每一个元素。下面我们来看看callee属性,返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。 callee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用。 callee 属性的初始值就是正被执行的 Function 对象,这允许匿名的 递归函数。 1 function factorial(n) { 2 if (n <= 0)3 return 1;4 else5 return n * arguments.callee(n - 1)6} 7 print(factorial( 3 )); 8