函數的參數是外界與函數內部通信的方法,對於有參函數來說,函數調用時函數有數據傳遞的關系。
看代碼:
//調用函數
max(5,7);
//定義函數
function max(x:int,y:int):int
{
if(x > y)
{
x = x;
} else {
x = y;
}
return x;
}
如果一個函數有返回值,可使用 return語句,並在定義函數時聲明返回值的類型。
上面的代碼在函數調用過程中發生了數據傳遞,先把5和7傳遞給x和y,再通過比較後返回大的值7,傳遞給函數max(),所以max(5,7)的值為7。
在定義函數時,括號中的變量稱為形式參數(簡稱形參)。上面定義max()函數時的x和y就是形參。在調用函數時,函數名後面括號中的變量或表達式稱為實際參數(簡稱實參)。如調用max()函數時的5和7。
函數的實參可以是任意數據類型的變量或表達式。
參數對於函數來說是非常重要,一個好的函數其參數應是不多不少。例如,toFixed()函數可以保留小數點的倍數,但它返回的是字符串。下面編寫一個返回值是數字的保留小數點的函數:
var a:Number = 2.55555;
//保留兩位小數並輸出
trace(保留小數點(a,2);
//定義函數
function 保留小數點(a:Number,b:uint):Number
{
//10的b次方
var t:uint = Math.pow(10,b);
//a*t取整後除t並返回
return Math.round(a*t) / t;
}
保留小數點的函數,需要兩個參數,一個代表要保留小數點的數值,一個是保留小數點的位數。
對於形參很多的函數,可用對象來代替,下面函數求兩點間的距離,用對象p1代表第一個點的坐標,用p2代表第二點的坐標:
//調用函數並把返回值賦值給變量d
//調用時定義兩個對象的屬性
var d:Numbet = distance({x:100,y:200},{x:100,y:100});
//輸出距離
trace(d);
function distace(p1:Object,p2:Object):Number
{
var x:Number = p1.x - p2.x;
var y:Number = p1.y - p2.y;
var dis:Number = Math.sqrt(x*x + y*y);
return dis;
}
定義對象一般有"new Object()",的形式,但也可通過"{}"運算符來定義對象,如:“{x:100,y:200}”相當於如下代碼:
var obj1:Object = new Object();
obj1.x = 100;
obj1.y = 200;
按值還是按引用來傳入參數
函數的參數可以是任何數據類型的變量,數據類型分為簡單數據類型和復雜數據類型。
按值傳入,那麼參數對象會復制一份副本供函數內部操作,參數本身不會受影響,按引用傳入,則不復制副本,函數內操作參數對象的引用,會改變參數對象的狀態。
在AS3中,所有的參數都是按引用傳入的。只不過,簡單數據類型是不變對象,傳引用和傳值的效果一樣,所以,如果參數是簡單數據類型,可看成是傳值,如果參數是復雜數據類型,就是傳引用。
對於簡單數據類型的參數來說,函數調用開始時,發生了從實參向形參的值傳遞,函數調用結束時形參並未向實參進行值傳遞,這種數據傳遞稱為值傳遞。
看下面的測試程序:見例:值傳遞
var a:int = 1;
trace("函數調用前,實參a="+a);
test(a);
trace("函數調用後,實參a="+a);
function test(x):void
{
x += 5;
trace("調用函數中,形參x="+x);
}
輸出結果為:
函數調用前,實參a = 1
調用函數中,形參x = 6
函數調用後,實參a = 1
從測試結果看調用函數時,形參的值開始時是由實參傳遞來的值1,加5後變為6,但形參的值以身試法後並沒有傳遞給實參,所以函數調用前後實參的值都是1。
函數調用開始時,發生了從實參向形參的數據傳遞,函數調用結束時形參也向實參進行數據傳遞,這種數據傳遞稱為引用傳遞。
看下面的測試程序:見例:傳引用
//建立一個對象
var person:Object = new Object();
//動態創建屬性age
person.age = 20;
trace("函數調用前,實參person.age="+person.age);
test(person);
trace("函數調用後,實參person.age="+person.age);
function test(per:Object):void
{
per.age = 10;
//修改對象的age屬性
trace("函數調用中,形參per.age="+per.age);
}
測試結果為:
函數調用前,實參person.age=20
函數調用中,形參per.age=10
函數調用後,實參person.age=10
從結果看出,調用函數前後,實參的值發生了變化。實參把值傳遞給形參後,形參又把改變的值傳遞給了實參。
在Flash中對象、數組等復雜數據類型變量是以引用傳遞的方式來傳遞數據的。
參數的默認值
AS3新增了兩個功能,可以在定義參數時給參數一個默認值,而且可以給函數不確定的參數。
在調用函數時,如果給定的實際參數與形式參數的數目不符,將會提示參數數目不匹配的錯誤。
例如下面的代碼形參有兩個,而實參只有一個
//錯誤:1136:參數個數不正確,應為兩個
test(1);
function test(x:int,y:int):Boolean
{
return x>y;
}
這裡就可使用參數默認值功能,參數默認值的定義形式為:
function 函數名(參數:數據類型=默認值):數據類型
{
}
下面是正確的代碼:
test(1);
function test(x:int,y:int=0):Boolean
{
return x>y;
}
在調用函數時,只傳遞了一個參數,但由於第二個參數有一個0的默認值,實際上是這樣調用函數:
test(1,0);
任意數量的參數
在使用trace()函數中可向這個函數傳遞一到多個任意數據類型的參數。
trace(參數1);
trace(參數1,參數2,參數3);
這種不定數量的參數,在AS3中可以實現,AS3允許給函數設定任意數量的參數:
function 函數名(...參數):數據類型
{
}
"...參數"中的"..."代表任意數量,參數名可以是任意合法的變量名。
任意數量參數的使用:
//調用函數
test();
//定義任意數量參數的函數
function test(...arg):void
{
trace(arg is Array);
}
任意數量的參數意味著可以有0到多個參數,從輸出的結果true可以看出。
下面的代碼傳遞3個參數:
test(1,2,3);
function test(...arg):void
{
trace(arg);
}
輸出結果為1,2,3,即輸出了數組arg中的所有元素。
使用任意數量的參數要注意一點:如果函數有多個參數,任意數量的參數必須寫在最後,否則程序人報錯。