1. 程式人生 > >函式的引數和Arguments物件

函式的引數和Arguments物件

  在javascript中,出現在函式定義文法中的引數列表是函式的形式引數,簡稱形參,一個函式可以有一個或者多個形參,函式物件定義時的形引數量可以通過length屬性獲得,例如
function add(x,y){
return x+y;
}
window.cross=function(v1,v2){
return v1*2+v2*1;
}
document.write('max_lenght='+max.length+'<br>');//max_lenght=2
document.write('wds_cross_length='+window.cross.length);//wds_cross_length=2

  函式呼叫時傳入的引數是函式的實際引數,簡稱實參,一般情況下,實參和形參的數量是相同的,但在javascript的中並不強求這一點,函式的形參和實引數量可以不相同。如果實參少於形參,則多餘的形參值為undefined(也可以通過預設引數來改變多餘形參的值,如下例);如果函式實參多於形參,則多出來的那一部分不能通過形參識別符號來訪問。
function add(x,y){
if(!y){
y=0;
}
return x+y;
}
document.write('add_value='+add(2)+'<br>');//add_value=2
document.write('add_value='+add(2,4)+'<br>');//add_value=6

  Arguments物件是一個集合,,可以按照數字下標獲取傳遞給函式的引數值。例如arguments.length可以獲得傳遞給函式的引數的個數,如果希望函式的形參個數和實參個數相同,可以通過通過訪問函式的length和arguments的length進行比較。由於可以通過length的屬性的到長度和通過下標訪問,Arguments的行為有點像陣列,但他其實並不是陣列,它不具備JAVASCRIPT核心陣列的一些方法,如join、sort、slice等。
  Arguments的一個重要功能是用來實現接受多種不同型別不同數目實參的函式,類似於過載。
function Point(){
if(arguments.length==0){
this.x=0;
this.y=0;
}else if(arguments.length==1){
var p=arguments[0];
if(p instanceof Point){
this.x=p.x;
this.y=p.y;
}else if(typeof(p)=="number" || p instanceof Number){
this.x=Number(p);
this.y=0;
}else{
throw new TypeError("引數型別錯誤");//如果這個引數既不是Point又不是Number,丟擲型別錯誤異常。
}
}else if(arguments.length==2){
var x=arguments[0];
var y=arguments[1];
if((typeof(x)=="number"||x instanceof Number)&&typeof(y)=="number"||y instanceof Number){
this.x=x;
this.y=y;
}else{
throw new TypeError("引數型別錯誤");
}
}else{
throw new TypeError("引數型別錯誤");
}
}
try{
var x =new Point(2,3);
document.write("x="+x.x+"<br>");
document.write("y="+x.y+"<br>");
document.write("****************"+"<br>");
x =new Point(new Point(4,6));
document.write("x="+x.x+"<br>");
document.write("y="+x.y+"<br>");
document.write("****************"+"<br>");
x =new Point(10);
document.write("x="+x.x+"<br>");
document.write("y="+x.y+"<br>");
document.write("****************"+"<br>");
x =new Point("a",true);
document.write("x="+x.x+"<br>");
document.write("y="+x.y+"<br>");
}catch(e){
document.write("引數型別錯誤");
}執行結果:

x=2
y=3
****************
x=4
y=6
****************
x=10
y=0
****************
引數型別錯誤

[quote]注意:在使用了命名引數的函式中,arguments中的引數也始終是相應命名引數的別名,不管這個引數是值型別還是引用型別,改變arguments中的引數值一定會影響到對應的命名引數,反之亦然。[/quote]