摘自javaScript高级程序设计(第三版):
ECMAScript函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript函数不介意传递进来多少个参数,也不介意传递进来参数是什么数据类型。
原因是:ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个函数。
其实,arguments对象只是与数组类似,因为可以使用方括号语法来访问它的每一个元素,即第一个元素为arguments[0],第二个元素为arguments[1]。可以通过arguments.length方法来确定传递进来的参数个数。
例如,以下两种函数的定义是等价的:
function sayHi(){
alert("hello"+arguments[0]+arguments[1]);
}
function sayHi(name,message){
alert("hello"+name+message);
}
这些说明了ECMAScript的特点为:命名的参数只提供便利,但是不是必须的。
通过访问arguments对象的length属性可以获知有多少给参数传递给了函数。
<html>
<head>
<script type="text/javascript">
function howmanyargs(){
alert(arguments.length);
}
function test(){
howmanyargs();//0
howmanyargs(1);//1
howmanyargs(1,2);//2
}
</script>
</head>
<body>
<button οnclick="test();">hhhh</button>
</body>
</html>
通过这一例子,我们可以通过让函数接受不同个数的参数,从而实现不同的功能。
<html>
<head>
<script type="text/javascript">
function getSum(){
if(arguments.length==1){
return arguments[0];
}
else if(arguments.length==2){
return arguments[0]+arguments[1];
}
}
function test(){
alert(getSum(10));//10
alert(getSum(20,20));//20
}
</script>
</head>
<body>
<button οnclick="test();">hhhh</button>
</body>
</html>
同时,另一方面,arguments对象可以与命名参数一起使用。并且,arguments对象的值永远和对应命名参数的值保持同步。
<html>
<head>
<script type="text/javascript">
function getSum(num1,num2){
if(arguments.length==1){
return arguments[0];
}
else if(arguments.length==2){
return arguments[0]+num2;
}
}
function test(){
alert(getSum(10));//10
alert(getSum(20,30));//50
}
</script>
</head>
<body>
<button οnclick="test();">hhhh</button>
</body>
</html>
也是说,如果通过arguments对象改变了传入参数的值,那么命名参数的值也会发生改变。
<html>
<head>
<script type="text/javascript">
function getChange(num1,num2){
arguments[1]=num2+10;
alert(num2);
}
function test(){
getChange(1,10);//20
}
</script>
</head>
<body>
<button οnclick="test();">hhhh</button>
</body>
</html>
在上面的例子中,arguments[0]与num1,arguments[1]与num2的值是保持同步的。但是不是说读取两个值的时候会访问相同的内存空间,只是说他们的值会同步。最后,没有传递值的命名参数的值为Undefined。
在严格模式中,如果函数只传递进来一个参数,那么即使对arguments[1]赋值10,num2的值也依然是Undefined。再者,重写arguments的值会导致语法错误,就是说,代码也是不会执行的。
个人理解:arguments对象只是为访问传递进函数的参数提供便利,并不能够提供参数!!!