8.3 函数的实参和形参
JS函数不指定形参类型,甚至不检查个数。
8.3.1 可选形参
当调用函数的时候传入的实参比函数声明时指定的形参个数要少,剩下的形参都将设为undefined值。应当给省略的形参一个合理的默认值。
这里回忆一下||的用法。
8.3.2 可变长的实参列表:实参对象
当调用函数的时候传入的实参个数超过函数定义时的形参个数时,没有办法直接获得未命名的引用。arguments指向参数对象的引用,实参对象是一个类数组对象,通过下标访问实参值,不用知道名字。
通常不必这样检查实参个数,省略都将是undefined,多出的参数会自动省略。
实参 对象重要之处就是可以操作任意数量的实参。
callee和caller属性
callee指代调用当前正在执行的函数。
caller指代调用当前正在执行的函数的函数,可以访问调用栈。
callee在匿名函数中通过递归来调用自身:
8.3.3 将对象属性用作实参
一个函数超过三个形参,对于程序员来说,记住正确顺序让人头疼,最好通过一个对象传入,属性顺序就无所谓了。
8.3.4 实参类型
传入实参类型时没有类型检查,有些情况会出错。
//返回数组或类数组对象a的元素的累加和
//数组a中必须为数字,null、undefined的元素都将忽略
function sum(a){
if(isArrayLike(a)){
var total=0;
for(var i=0;i<a.length;i++){
var element=a[i];
if(element==null){
continue;
}
if(isFinite(element)){
total+=element;
}else{
return tatal;
}
}
}else{
throw new Error("求和参数必须为数组或类数组!")
}
}