Arguments对象表示参数集合,它是一个伪类数组,拥有和数组相似的结构,可以通过数组下标的形式来访问函数实参值
function f(){
for(var i=0;i<arguments.length;i++){ //等价for(var i=0;i<f.arguments.length;i++){
alert(arguments[i]);
}
}
1.通过Arguments对象修改每个实参的值
function f(){
for(var i=0;i<arguments.length;i++){ //
arguments.[i]=i; //修改每个实参的值
alert(arguments[i]);
}
}
f(3,6,6)//1,2,3
function f(){
arguments.length=2;//修改arguments对象的length值
for(var i=0;i<arguments.length;i++){ //
alert(arguments[i]);
}
}
f(3,6,6)//3,6
使用callee回调函数
function f(x,y,z){
var a=arguments.length;//实参的个数
var b=arguments.callee.length;//形成的个数,等价 f.length
if(a!=b){
throw new Error('传递的参数不匹配')
}else{
return x+y+z;
}
}
alert(f(3,4,5)) //12
2.使用Function对象
javascript中因为Funciton构造函数可以创建函数,所以函数就继承了Function对象的所有属性和方法
2.1 Function对象本身定义了一个属性length ,在函数体 内外 皆可用,Arguments的对象的length只能在函数体 内 使用
function check(a){
if(a.length!=a.callee.length)//实参和形参的length不相等
throw new Error('参数不一致')
}
function f(a,b,c,d){
check(arguments);
return (a+b+c+d)/3
}
alert(f(3,4));// 参数不一致
2.11作为对象,用户还可以自定义属性或方法
function.property
function.method
function f(){
f.x=1;//函数体内定义属性,函数被调用后方能访问
alert(f.x);//1
alert(f.y);//2
}
f.y=2;//函数体外定义属性,可随时访问
alert(f.y);//2
alert(f.x);//undefined,函数体外调用无效
f();
alert(f.x);//1
2.2 call()和apply()是Function对象的原型方法(改变this的指向)
function.call(thisobj,args...)//接收多个参数的列表
function f(x,y){return x+y;}
function o(a,b){return a*b;}
alert(f.call(o,3,4)); //返回7,把f绑定到o对象上,变成o的一个方法,然后动态调用f()
function.apply(this.obj,args)//接收一个数组或者类数组(如arguments对象)
function f(x,y){return x+y;}
function o(a,b){return a*b;}
alert(f.apply(o,[3,4])); //返回7,把f绑定到o对象上,变成o的一个方法,然后动态调用f()
function max(){
var m=Number.NEGSTIVE_INFINITY;//声明一个负无穷大的数值
for(var i=0;i<arguments.length;i++){
if(arguments[i]>m)
m=arguments[i];
}
return m;
}
var a=[23,45,2,46,62,45,56,63];
var m=max.apply(Object,a);
alert(m);//返回63
也可调用Math的max()
var a=[23,45,2,46,62,45,56,63];
var m=Math.max.apply(Object,a);
alert(m);//返回63
注意:
function f(){}
f.call(Object) //动态(即临时)绑定到Object对象的方法
Object.f();//再次调用该方法,则报错------