Javascrip中的每个函数都会有一个Arguments对象实例arguments,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身。
1)求给定的若干个值中的最大值
1 function max(a,b){ 2 return a-b>0 ? a : b; 3 } 4 function Max(){ 5 var maxValue = arguments[0]; 6 for(var i=1; i<arguments.length; i++){ 7 if(maxValue < arguments[i]){ 8 maxValue = arguments[i]; 9 } 10 } 11 return maxValue; 12 } 13 console.log(Max(1,2,0,-10,100,5)); // 100
我们知道每一个对象都有自己的属性,arguments对象也不例外,首先arguments的访问犹如Array对象一样,用0到arguments.length-1来枚举每一个元素。下面我们来看看callee属性,返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文。callee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用。callee 属性的初始值就是正被执行的 Function 对象,这允许匿名的递归函数。
2)利用arguments.callee进行递归
1 function factorial(n){ 2 if (n <= 0){ 3 return 1; 4 } else{ 5 return n * arguments.callee(n-1); 6 } 7 } 8 alert(factorial(5)); // 120
需要注意的是:
1.arguments是一个object对象,它不是数组,不能对它使用shift、push、join等方法。
2.上述举例时用的arguments[i]中的i只是作为arguments对象的属性,并不能理解为数组下标。
3.命名参数只提供便利,不是必须的;如果没有声明,可以用arguments[i]来访问数据。
4.没有传递值的命名参数将自动赋予undefined。