vetty

javascript arguments与javascript函数重载

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);

 

posted on 2015-02-13 11:34  cocos2014  阅读(1149)  评论(2编辑  收藏  举报

导航