javascript--函式基礎(使用引數------使用Arguments物件,使用Function物件)
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();//再次呼叫該方法,則報錯------