ECMAScript中函数没有标签名的特性,所以ECMAScript函数中没有重载。
Javascript中arguments的存在可以弥补javascript中函数没有重载的不足。
Javascript中函数中的参数是以数组的形式保存的,所以在JavaScript中调用函数给函数传递的参数时,不会受到我们定义函数时设置的参数个数的限制。也就是说如果我们给一个函数定义了2个参数,我们传递的时候可以不传,可以传一个,也可以传两个,传三个...都可以,不会受函数参数个数的影响。arguments类似一个数组(但是不是真正的Array对象),同样可以像数组一样用方括号来访问它的每一个值,并用arguments.length来判断参数的个数。
应该说我们可以向ECMAScript(javascript是对ECMAScript标准的实现)函数任意的传递参数,并可以通过arguments对象来访问这些参数。
arguments的使用:
function myfun() { console.log(arguments.length); } myfun("1","2");//2 myfun("1");//1 myfun();//0
function myfun(num1,num2) { if(arguments.length === 1){ console.log(arguments[0]); } else if(arguments.length === 2) { console.log(arguments[0]+arguments[1]); } else if(arguments.length === 3) { console.log(num1+num2+arguments[2]); }else { console.log(arguments[0]+" "+num1); } } myfun(1);//1 myfun(1,2);//3 myfun(1,2,3);//6 myfun();//undefined undefined
命名参数可以和arguments一起使用
和其他oo语言不一样,在ECMAScript中,所有参数传递的都是值,不可能通过引用传递参数(毕竟arguments中保存的都是参数的值)。
arguments对象中还定义了callee属性,用来引用当前正在执行的函数,例如在递归中使用:
function factorial(num) { if(num <=1 ) { return 1; } else { return num*arguments.callee(num-1); } } console.log(factorial(5));//120
需要注意的是如果一个函数的参数有3个,传递的实参只有2个,那么arguments[2]和第三个参数是不共享的.
function foo(x, y, z) { // 声明的函数参数数量arguments (x, y, z) console.log(foo.length); // 3 // 真正传进来的参数个数(only x, y) console.log(arguments.length); // 2 // 参数的callee是函数自身 console.log(arguments.callee === foo); // true // 参数共享 console.log(x === arguments[0]); // true console.log(x); // 10 arguments[0] = 20; console.log(x); // 20 x = 30; console.log(arguments[0]); // 30 // 不过,没有传进来的参数z,和参数的第3个索引值是不共享的 z = 40; console.log(arguments[2]); // undefined arguments[2] = 50; console.log(z); // 40 } foo(10, 20);