定义参数
函数参数包括两种类型:形参和实参。行参就是函数声明的参数变量,它仅在函数内部可见,而实参就是实际传递的参数值。
function f(a,b){
return a+b;
}
var x=1,y=3; //定义实参
alert(f(x,y)); //调用函数并传递实参
JavaScript可以包含零个或者多个实参。函数定义时的形参可以通过length属性来获取形参个数。
alert(f.length);
一般情况下,形参个数和实参格式应该相同。但特殊情况下,可以不相同。
(function(a,b){
alter(typeof a); //返回number
alter(typeof b); // 返回undefined
})(2); //调用函数,传递一个实参
如果实参多于形参,多余的实参会被忽略。
形参与函数体内使用var语句声明的变量都属于局部变量,仅在函数体内可见。当私有变量与形参发生冲突时,则私有变量拥有较大的优先权。
function f(a){
var a=3;
return a;
}
alter(f(8)); //返回3
使用arguments
arguments对象表示参数集合化,它是一个伪类数组,拥有与数组相似的结构,可以通过数组下标的形式访问函数实参值,但是没有基础Array的原型方法。
function f(){
for(var i=0;i<arguments.length;i++){
alert(arguments[i]);
}
}
f(4,6,7); //返回4,6,7
使用arguments对象可以随时编辑实参值。
function f(){
for(var i=0;i<arguments.length;i++){
arguments[i]=i;
alert(arguments[i]);
}
}
f(4,6,7); //返回0,1,2
如果arguments的length属性值变小,则会丢弃arguments数据集合后面对应的个数的元素。
function f(){
arguments.length=2;
for(var i=0;i<arguments.length;i++){
alert(arguments[i]);
}
}
f(4,6,7); //返回4,6
使用callee回调函数
arguments对象包含一个callee属性,它引用当前arguments对象所属的函数,使用该属性可以在函数体调用函数自身。在匿名函数中,callee属性比较有用,利用它来设计函数迭代操作。
举个例子:使用arguments.callee获取匿名函数,然后通过函数的length属性获取函数形参个数,最后比较实参与形参个数以检测用户穿戴的参数是否符合要求。
function f(x,y,z){
var a=arguments.length; //获取函数实参个数
var b=arguments.callee.length; //获取函数形参个数
if(a!=b){
throw new Error("传递的参数不匹配!");
}else{
return x+y+z;
}
}
alert(f(4,6,7)); //返回值17
Function对象的length属性返回的是函数形参个数;而arguments返回的则是函数实参个数。
如果不是匿名函数,则arguments.callee等于函数名。
function f(x,y,z){
var a=arguments.length;
var b=f.length;
if(a!=b){
throw new Error("传递的参数不匹配!");
}else{
return x+y+z;
}
}
alert(f(4,6,7)); //返回值17
应用arguments对象
灵活使用arguments对象,可以提升使用函数的灵活性,增强函数在抽象编程中的适应能力和纠错功能。
举个例子:定义一个求平均值的函数。
function avg(){
var num=0,k=0; //num总数,k个数
for(var i=0;i<arguments.length;i++){ //遍历所有实参
if(typeof arguments[i]!="number") //如果不是数值,则忽略
continue;
num+=arguments[i];
k++;
}
num/=k;
return num;
}
alert(avg(4,6,7,8,3,2)); //返回5
验证函数参数的合法性。
举个例子:通过使用arguments来模拟重载,其实现机制是通过判断arguments中实际参数和类型来执行不同的逻辑。
function f(){
switch(arguments.length){
case 0:
return "vv";
case 1:
return "vv"+arguments[0];
case 2:
return "vv"+arguments[1];
case 3:
return "vv"+arguments[2];
};
}
alert(f());
alert(f("ft"));
callee是arguments对象的一个属性,其值是当前正在执行的function对象,它的作用是使匿名function可以被递归调用。