javascript理解参数

摘自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对象只是为访问传递进函数的参数提供便利,并不能够提供参数!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值