Flash3.0菜鳥學飛教程函式之形式引數和實際引數?

摘要: 本例為Flash AS3.0菜鳥學飛系列教程,在上一節中我們初步瞭解和認識了“函式”的返回語句應用,在本Flash AS3.0程式碼教程中我們來學習函式之形式引數和實際引數,希望能給對Flash程式設計感興趣的朋友們帶來幫助~~

步驟/方法

函式的引數是外界與函式內部通訊的方法,對於有參函式來說,函式呼叫時函式有資料傳遞的關係。
看程式碼:
//呼叫函式
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中的所有元素。
使用任意數量的引數要注意一點:如果函式有多個引數,任意數量的引數必須寫在最後,否則程式人報錯。

注意事項

請按照步驟製作

本文僅供參考。

相關問題答案