1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数。他不是一个数组,如果用typeof arguments,返回的是’object’。虽然我们可以用调用数据的方法来调用arguments。比如length,还有index方法。但是数 组的push和pop对象是不适用的。
2.函数定义时的参数个数和函数调用时的参数个数没有任何关系。 在函数中可以用f.arguments[0]和f.arguments[1]得到调用时传入的第一和第二个参数,arguments不能够创建,是函数自身的参数,只有当函数开始执行是才能使用。
虽然arguments的使用方法,很像数组,但是它并不是数组。arguments对象的长度是由实参个数而不是形参个数决定的。形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠。
1 function argumentsTest (a,b) { 2 // alert(typeof arguments); 3 alert(arguments.length); 4 alert(arguments[1]); 5 } 6 argumentsTest(1,2,3,4);
输出的结果为4,2;
1 function argumentsTest (a,b) { 2 alert(arguments.callee); 3 alert(arguments.callee.length); 4 } 5 argumentsTest(1,2,3,4);
输出的结果为argumentsTest,2;
3.由JavaScript中函数的声明和调用特性,可以看出JavaScript中函数是不能重载的。
根据其他语言中重载的依据:"函数返回值不同或形参个数不同",我们可以得出上述结论:
第一:Javascript函数的声明是没有返回值类型这一说法的;
第二:JavaScript中形参的个数严格意义上来讲只是为了方便在函数中的变量操作,实际上实参已经存储在arguments对象中了。
另外,从JavaScript函数本身深入理解为什么JavaScript中函数是不能重载的:在JavaScript中,函数其实也是对象,函数名是关于函数的引用,或者说函数名本身就是变量。
如何实现javascript的重载呢?
使用arguments判定参数的个数使用不同的方法实现函数重载:
1 <script language="JavaScript"> 2 function f(length) 3 { 4 var len= arguments.length; 5 if(1 == len) 6 { 7 var width = arguments[1]; 8 alert("高为:"+length+",宽为:"+width); 9 } 10 else 11 { 12 alert("高为:"+length); 13 } 14 } 15 </srcipt>
4.arguments对象中有一个非常有用的属性:callee。arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。
1 function count(a){ 2 if(a==1){ 3 return 1; 4 } 5 return a + arguments.callee(--a); 6 } 7 8 var mm = count(10); 9 alert(mm);