javaScript函数不介意传递进来多少个参数,也就是说,即便你定义的函数形参只有两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数。之所以会这样,原因是JavaScript中的参数在内部是用一个类似数组的对象来表示的。函数接收到的始终都是这个类数组对象,而不关心数组中包括哪些参数。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
arguments这个类数组对象可以使用方括号语法访问它的每一个元素(即第一个元素是arguments[0],第二个元素是arguments[1],以此类推),使用length属性可以确定实际传递进来多少个参数。
一、javascript函数中命名参数只是提供便利,但不是必须的,因为它完全可以使用arguments对象来实现相同的功能,例如下面两个函数,一个利用命名参数一个利用arguments实现相同的功能。
alert('hello ' + name + ',' + message);
}
function sayHi(){
alert('hello ' + arguments[0] + ',' + arguments[1]);
}
二、在调用javaScript函数时传递进去的命名参数可以和arguments对应的值相互同步,否者相互独立。
如下所示:
doSomething(0,1);
//两个命名参数都传值的情况
function doSomething(num1,num2) {
arguments[1] = 22;
alert(num1); //0
alert(num2); //22
num1 = 11;
alert(arguments[0]); //11
alert(arguments[1]); //22
}
doSomething(0);
//只传递一个命名参数的情况
function doSomething(num1,num2) {
arguments[1] = 22;
alert(num1); //0
alert(num2); //undefined
num1 = 11;
alert(arguments[0]); //11
alert(arguments[1]); //22
}
从逻辑上分析:
只有当传入值的命名参数才能同arguments对象中的值进行同步也是有道理的,因为既然函数定义了命名参数,说明期待使用者在调用的时候传入值,如果调用者传入了值,说明在函数内部不管什么方式如果读取和修改调用者传递进来的参数都应该是同一的值才合理,所以javaScript引擎会将这种情况进行数值同步。如果调用者没有传入命名参数,该命名参数将会作为一个值为undefined未声明的局部变量来看待,并且该值和arguments对象中的值可能被函数内部作为不同的变量来使用,所以就不能同步。
javaScript中函数参数,只有调用时传入的参数才作为传统意义的参数,否者就作为局部变量看待。