各種-actionscript3.0之函數(shù)首先聲明這不是我教程以下內(nèi)容來源于殿堂路、幫助文_第1頁
各種-actionscript3.0之函數(shù)首先聲明這不是我教程以下內(nèi)容來源于殿堂路、幫助文_第2頁
各種-actionscript3.0之函數(shù)首先聲明這不是我教程以下內(nèi)容來源于殿堂路、幫助文_第3頁
各種-actionscript3.0之函數(shù)首先聲明這不是我教程以下內(nèi)容來源于殿堂路、幫助文_第4頁
各種-actionscript3.0之函數(shù)首先聲明這不是我教程以下內(nèi)容來源于殿堂路、幫助文_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余30頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

ActionScript3. 之函首先這不是我的。以下內(nèi)容來源于《殿堂文納和整理,很多例子和解釋文字都是對其他老師的代碼和文字進(jìn)行了原文的,在些也感謝黑羽老師及其它網(wǎng)絡(luò)上的老師為flas所做出的貢獻(xiàn)。function{trace("o!Howare}定義是:函數(shù)是執(zhí)行特定任務(wù)并可以在程序中重用的代碼塊。ActionScript3.0中函數(shù)為分兩類:方法(Method)和函數(shù)閉包(Functionclosures此換句話說,函數(shù)是一種將調(diào)用時才執(zhí)行(不調(diào)用不執(zhí)行)某函數(shù)成為了AS進(jìn)行修改的中心點(diǎn)。在函數(shù)中做個修改,該修改就能被應(yīng)用編寫成函數(shù)可以在許多程序中重復(fù)使用。因此,可以開發(fā)出一個可被用定義,但直到或調(diào)用它之前什么也不會發(fā)生??梢宰约簻y試一下這一點(diǎn),即在主時間軸的第1幀中,用如下代碼創(chuàng)建一個新的Flash影片:function{trace("o!Howare}當(dāng)測試該影片時會看到,盡管在代碼中有一個trace()動作,但什么也沒greeting():void{trace("o!Howare}Outputo!Howaretrace()Flashtrace("Usetracetohelpdebugyour沒有參數(shù)的Math.random()方法來生成一個隨機(jī)數(shù):varrandomNum:Number=個函數(shù)。函數(shù)有兩種定義方式。一種是我們非常熟悉的函數(shù)語句定義法(Functionstatement)ActionScript特有的函數(shù)表達(dá)式定義法(Functionexpressionfunction函數(shù)名(參數(shù)1:2:}function{returna+}上面那樣包括function關(guān)鍵字。的數(shù)據(jù)的類型。在后面會講到如何返回?cái)?shù)據(jù)。使用void函數(shù)表達(dá)式定義法是ActionScript特有的一各定義方式。定義格式如下:var:Function=function1:2:參數(shù)類型,……):}注意=號右邊的內(nèi)容function后面沒有跟隨函數(shù)名,這相當(dāng)于創(chuàng)建了一個函數(shù)對象并將賦值給了左邊的函數(shù)型變量這種方法經(jīng)常被中、var{returntest1:Function=function():void{trfunctiontest2():void}varmyArray:Array=newArray();myArray[0]("My除此之外,函數(shù)語句定義法和函數(shù)表達(dá)式定義法還體現(xiàn)在函數(shù)體中this關(guān)鍵字的上。使用函數(shù)語句定義法,則this關(guān)鍵字牢牢指向當(dāng)前函數(shù)定義的域;而若使用函數(shù)表達(dá)式定義法,則隨著函數(shù)附著的對象不同,this關(guān)鍵字也隨之改變。這里不做深入探討,有的朋友中以看一下《殿堂》,里面有數(shù)的傳遞給外部代碼,否則嵌套函數(shù)將僅在其父函數(shù)內(nèi)可用。例如,下面的代碼在greeting()函數(shù)兩個嵌套函數(shù):function{function{return"}function{return"新好}return(greet()+""+}//輸出 o!新好如,如果greeting()函數(shù)可以使用不同的來顯示個性化的問候,就會使 }greeting("");//顯示:o!Howareyou?greeting("");//顯示:o!Howareyou?在greeting()函數(shù)中所看到的那樣,參數(shù)被命名為“names”,在每次調(diào)用該函數(shù)定義的圓括號中的。大家可能注意到了,參數(shù)的與常規(guī)變量的相下面的代碼是不正確地參數(shù)的例子,將產(chǎn)生錯誤://不能使用var關(guān)鍵字。 names:String):void{trace("o."+namgreeting(names:String;):void{trace(}在as3中可以在圓括號中初始化變量,這是正確的寫法,也是與as2最大functiongreeting(names:String=""):void{trace("o!}test()函數(shù)的例子functiontest(names:String,weight:Number):void{}test("",50)//顯示:的體重是Actionsfunctiontest(names:String,}test("",50);//顯示:的體重是function(1:類型=2:類型=//函數(shù)語}function{}test();//輸出:6321test(9);//輸出:12921test(2,9);//輸出:12291test(1,2,3);//輸出:6123、參數(shù)和正確傳入?yún)?shù)要么參數(shù)被為圓括號中的參數(shù)列表。但是,不管一個函數(shù)是否了任何參數(shù),argumentsargumentsarguments變量(對象,當(dāng)arguments[0]、arguments[1]傳入的第一個參數(shù)、第二個參數(shù),依次類推。arguments有一個屬性length,arguments.lengthfunctiontest(a:int=3,b:String="{for(vari:uint=0;i<arguments.length;i++)}}testtest(2)//輸出test(2,"ok",32.4)//輸出2oktestargumentsarguments所的將是該參數(shù),而不是arguments對象。下面的代碼不生成輸出結(jié)functiontest(x:int,arguments:int):voidfor(vari:uint=0;i<arguments.length;{}}test(1,2);//報錯:可能未定義的屬性length(通過static類型intargumentscalleevarfactorial:Function=function(n:Number):Number{returnn*arguments.callee(n-return}通過callee調(diào)用自身可以避免因?yàn)楦膭硬糠值暮瘮?shù)名但忘了改動函在as2中可以不用管函數(shù)的定義格式,可以傳入任意多個參數(shù)。但在as3function{}test();//輸出:參數(shù)個數(shù)不正確。應(yīng)為3個test(9);//輸出:參數(shù)個數(shù)不正確。應(yīng)為3個test(2,9);3test(1,2,3,5);//報錯:參數(shù)個數(shù)不正確。不應(yīng)超過3個test([3,4]);//報錯:Array類型值的隱式強(qiáng)制指令的目標(biāo)是非相關(guān)類型function{}test();//輸出:632test(9);//輸出:1292test(2,9);//輸出:1229test(1,2,3,5);/3個function{}functiontest(a:int,b:int=2,c:int=1):void{}為了提供傳入任意參數(shù)的靈活性,as3提供了一個新關(guān)鍵字...rest。那么只要在參數(shù)中定義了...rst,那么就可以傳入任意多的參數(shù)了。這些參數(shù)以數(shù)組的形式保存在restrest只是推薦名,我們可以改成它的名字,比如prasrst關(guān)鍵字,那么argumns就不能再使用了。盡管...rst參數(shù)提供了與argumns數(shù)組和rument.lengh屬性相同的功能,但是它不提供與argmentscallee類似的功能。使用...rest參數(shù)之前,應(yīng)確保不需要使用rgumets.calee。看下面的例子:functionfor(variinrest){}}testA(1,[5,9],"新好參數(shù)的長度1新好...rest參數(shù)還可與其它參數(shù)一起使用,前提是它必須是最后一個列出的參testB()函數(shù)的第一個參數(shù)names是String類型,第二個參數(shù)使用...rest...restfunctionfor(variinrest){}}testB("新好",[50,3],534,"你好參數(shù)的長度可以看出:實(shí)際“新好”并沒有輸出,要想輸出,只有再加上語trace(names)五、按值還是 當(dāng)給函數(shù)傳入?yún)?shù)時,參數(shù)是用兩種方式之一進(jìn)行傳遞的:按值和按。其區(qū)別與數(shù)據(jù)類型有關(guān)。按值傳入,那么參數(shù)對象會一份副本供函數(shù)操作,用,那么會改變參數(shù)的狀態(tài)。實(shí)際上,在AS3中,所有的參數(shù)都是按來傳入。AS3Boolean、String、int、uint和Number。這function{return}varvarc:Number=test(a);Output窗口會顯示如下內(nèi)容:56在這個例子中,盡管變量a的值被傳遞給了函數(shù),并且那個值在函數(shù)中被增1,a5aac直接存值。每個變量不因?yàn)槠渌兞康闹档母淖兌淖?。即使形參a名與變量a名完全相同也是如此,因?yàn)楹瘮?shù)的a將指向內(nèi)存中的新位置,這些位置不同于函數(shù)外部同名的變量a所在的位置。、當(dāng)復(fù)雜數(shù)據(jù)類型被作為參數(shù)傳遞時,它們是按進(jìn)行傳遞函數(shù)中對對象所做的任何事情都會影響到該對象本身,沒有產(chǎn)生該對象的副本。MovieClip等等。下面看一下復(fù)雜數(shù)據(jù)類型作為參數(shù)傳遞時的情況。例1:以Arrayfunction{num=100;}varvarb:Array=[1,2,3];trace(a);//輸出:5a100,trace(b);//輸出:輸出:15,2,3,100b例2:以O(shè)bject為例:function{obj.y++;trace(obj.x,}varmyObj:Object={x:10,y:15};trace(myObj.x,myObj.y);//10test(myObj);//11trace(myObj.x,myObj.y);//11myObj對象具有兩個屬性:x和y。該對象作為參數(shù)傳遞給test()函數(shù)。因?yàn)樵搶ο蟛皇腔愋?,所以它不但按傳遞,而且還保持同一個。這意味著對函數(shù)的參數(shù)的更改將會影響到函數(shù)外部的對象屬性。returnreturn當(dāng)使用return語句從一個函數(shù)返回一個值時,應(yīng)該指定要被返回的數(shù)據(jù)類型(在函數(shù)定義的圓括號后面指定。在此之前的例子中,返回類型是void(表示無返回。但是,當(dāng)返回一個字符串時,就應(yīng)該將返回的數(shù)據(jù)類型設(shè)置成String;Number,等等。function{varreturn}function{varreturn}trace(rectArea(3,5));//報錯:String類型值的隱式強(qiáng)制指令的目標(biāo)是非相關(guān)類型Number。只要用到return語句,F(xiàn)lashreturnfunction{varreturntrace("Thearea}在上面的例子中,trace("Theareais:"+Area)語句總是不會被執(zhí)行。這是returnreturnfunction{for(vari:Number=0;i<myArray.length;i++)//如果成員之一匹配string的值,就返回相應(yīng)的索引。這會導(dǎo)致該函數(shù)停if{return}}returnmyArray.length;}vararray:Array=[1,"ab",34,"efg",28.5];varnum:Number=test(array,"efg");//varnum:Number=test(array,"a")很明顯,在任何對該函數(shù)的調(diào)用中,只可能遇到其中的一個return語句。returnreturnforVararea:Number=rectArea(6,3);//返回值存入變量vararea:Number=rectArea(6,3)*5下面的內(nèi)容是有效的,然而卻是不太有用的ActionScript語句functionrectArea(Width:Number,Height:Number):Number{return}if{trace("}elsetrace("面積小于}MovieClip、Function等等。七 函合起來使用時,函數(shù)就被調(diào)用了,但是名字本身只是作為對函數(shù)的。這就是說,function{varreturn}varfArea:Function=rectArea;“作用域”是在ActionScript中定義的某些標(biāo)識符的作用范圍。有些標(biāo)識某個部分定義的變量。在ActionScript3.0中,始終為變量分配它們的函當(dāng)在一個函數(shù)中適當(dāng)?shù)匾粋€變量時,該變量就被稱為“局部變量”。局functiontest():void{vargreet:String="o!howareyou?";}trace(greet);//輸出:的屬性greet未定functiontest(string:String):void{} o!");//輸出:trace(string);//輸出:的屬性string未定與局部變量不同的是,全局變量是在任何函數(shù)或類定義的外部定義的變量。在該函數(shù)外面的變量(但在定義該函數(shù)的相同時間軸中)是可以在該函數(shù)中使function{}varstring:String="o!";trace(string);//輸出:o!在該例子中,變量string是在該函數(shù)之外的,但仍可以在該函數(shù)之中使用。從該示例可看出,全局變量在函數(shù)定義的和外部均可用。如果用于局部變量的變量名已經(jīng)被為全局變量,那么,部變量在作用strtest()trace外部的trace語句則輸出該變量的全局值。varstr:String="global";functiontest(){varstr:String=trace(str);//}trace(str);//在全局作用域中的函數(shù)在整個代碼中都可用。例如,ActionScript3.0包含可在代碼中的任意位置使用的全局函數(shù),如trace()和int()。嵌套函數(shù)(即在另一個函數(shù)中的函數(shù))可以用在它的函數(shù)中的任意位置。當(dāng)在時間軸中聲functiontest():voidif(this.currentFrame==1)}else}}然后在主時間軸第30幀關(guān)鍵幀,再次調(diào)用函數(shù)可以在它的時間軸的任意地方、任意時間調(diào)用。在相同的時間軸中使用該函數(shù),function}把寫有函數(shù)的空的影片剪輯拖到主場景中間,起實(shí)例名mc,//輸出:1180:調(diào)用的方法circle可能未定義。circle()mc//輸出:1180:circle//輸出:1061circle(通static類型DisplayObjectContainer)this.parent返回的是DisplayObjectContainer對象,DisplayObjectContainer不是動態(tài)類,需要進(jìn)行類型的轉(zhuǎn)換,所以用MainTimeline(this.parent)轉(zhuǎn)換之后便可以使用。在沒綁定文檔類的情況下,MainTimeLineflashMovieClip,也是動態(tài)類,并成為stage對象的唯一子對象。因?yàn)镸ainTimeline是動態(tài)類,可以動態(tài)填加方法,MainTimeline(this.parent).circle()就等于給主時間軸實(shí)例動態(tài)填加了circle()方法(理解的,不知對不對。下面幾種寫法也可以:因?yàn)橹鲿r間軸類MainTimelineMovieClipMovieClip(this.parentasn*(n-1)*(n-2)…*1例如,51205*4*3*2*1)。下面就是一個完functionfactorial(n:Number):Number//我們把x>0if(n>0)1(否則就成死循環(huán)了)returnn*factorial(n-1);}elsereturn}}trace(factorial(5));//輸出單些:trace(factorial(3));當(dāng)?shù)谝淮握{(diào)用factorial()函數(shù)時,是用3這個值進(jìn)行調(diào)用的。因?yàn)閚大于0,所以它執(zhí)行if語句中的語句。該語句指示函數(shù)返回表達(dá)式n*factorial(n-1)的值。為了計(jì)算該表達(dá)式,該函數(shù)必須調(diào)用它自己(factorial(n-1)factorial2同樣,n的值大干0,所以執(zhí)行第一個return語句。該函數(shù)再一次調(diào)用它自己。這一次,是用1這個值進(jìn)行調(diào)用的。重復(fù)相同的處理,再一次用O這個值調(diào)用factorial()。然而,在這次函數(shù)調(diào)用時,因?yàn)閚不再大于01并且不再調(diào)用該函數(shù)了。應(yīng)該非常,以確保遞歸函數(shù)在遞歸的次數(shù)上有一個限 {returnn*factorial(n-} Flash對此有一個保護(hù)措施,即在一個設(shè)定的遞歸次數(shù)之后,會在影片中ActonScrpt。如果在影片中使用了這種無限遞歸(即沒有一個條件能使該遞歸停止)的函數(shù),當(dāng)測試影片時就會在Output窗口中看到警告信息。function{if(x>0)returnx*x+squareSum(x-}elsereturn}}在許多情況下這可能是有用的。例如,可能有一個名為area()的函數(shù),它基于兩個參數(shù)(各個邊的長度)來計(jì)算矩形的面積。但可能還希望有一個area()函數(shù),ifswitcharguments.length決定)計(jì)算矩形的面積或者圓的面積。這并不是ActionScript的等價物。functionarea(...rest):Number{switch{case1varreturnMath.PI*r*r;case2varWidth:Number=rest[0];varHeight:Number=rest[1];returnWidth*Height;defaultreturn}}trace(area(3,5));//輸出:15trace(area(2));//輸出:12.566370614359172trace(area(6,8,33(數(shù)組的長度我們知道:函數(shù)只是一段可執(zhí)行代碼,編譯后就“”了,每個函數(shù)在內(nèi)存中只有一份實(shí)例,得到函數(shù)的點(diǎn)便可以執(zhí)行函數(shù)了。函數(shù)可以作為另一個函數(shù)的參數(shù)或返回值,可以賦給一個變量。函數(shù)可以嵌套定義,即在一個函數(shù)內(nèi)還是來看一下幫助文檔上的例子:下面的代碼創(chuàng)建兩個函數(shù):foo()(返回一個用來計(jì)算矩形面積的嵌套函數(shù)ectAra()和bar(調(diào)用foo()并將返回的函數(shù)閉包在名為yProdct的變量中。functionfoo():Functionvarx:int=function{returnx*}return}function{varx:int=2;vary:int=4;varmyProduct:Function=//相當(dāng)于:varmyProduct:Functiontrace(myProduct(4}bar();//輸出我是這樣理解的(不一定對呀:在bar()函數(shù)中,首先調(diào)用foo()函數(shù),foo()函數(shù)執(zhí)行后返回rectArea函數(shù)對象,并把rectArear函數(shù)的附值給myProduct。然后調(diào)用myProduct(4)并執(zhí)行,由于myProduct和rectArea持有同一個,所以調(diào)用myProduct(4)就等于調(diào)用rectArea(4),也就是計(jì)函數(shù)的定義域(是不是也可以理解為“詞匯環(huán)境”)是在boo()函數(shù)中,所以rectArea函數(shù)保留它作用域中的所有變量、屬性、方法和對象以及它們的值,也就是xbarx(2),當(dāng)調(diào)用函數(shù)閉包myProductfoo()中定義的變量x(40。因此,bar()函數(shù)將返回值160,而不是8。前面已經(jīng)學(xué)過如何在ActionScript中創(chuàng)建一個自定義函數(shù)了。通常,當(dāng)人們談到函數(shù)時所指的就是這些自定義函數(shù)。但是,在ActionScript中還有許多(trace()――traceflashisNaN()――NaN(非數(shù)字true。isNaN()函數(shù)可用于檢查一個數(shù)字表達(dá)式是否成功地計(jì)算為一個數(shù)字。NaN值是Number數(shù)據(jù)類型的特函數(shù)究竟是什么?ActionScript3.0中的函數(shù)是對象。當(dāng)您創(chuàng)建函數(shù)時,ActionScript3Function作為參數(shù)傳遞給另一個函數(shù)的函數(shù)是按(而不是按值)傳遞的。在將某functiononframe(e:Event){}實(shí)際上,每個函數(shù)都有一個名為length的只讀屬性,它用來為該函arguments.lengthActionScriptfunctiontest(x:uint,y:uint):void{trace("argumentsarguments.length);trace("arguments需要收到的參數(shù)數(shù)量:"+test.length);}test(1,3,56,arguments實(shí)際收到的參數(shù)數(shù)量:4arguments需要收到的參數(shù)數(shù)量:2如果要在嚴(yán)格模式下進(jìn)試,必須用函數(shù)表達(dá)式方法來test()函數(shù),vartest:Function=function(x:uint,{trace("arguments實(shí)際收到的參數(shù)數(shù)量:"+arguments.length);trace("arguments需要收到的參數(shù)數(shù)量:"+test.length);test(1,3,56,這回test(1,3,56,890)函數(shù)在嚴(yán)格模式和標(biāo)準(zhǔn)模式下都可運(yùn)行。我們可下面的test()函數(shù)是用函數(shù)語句定義法定義的函數(shù):functiontest(){}trace(Function)trace(testMethodClosure類對象;第二行輸出告訴我們這個神秘的MethodClosure類的父類是Function;第三行確testFunctiontestObject。因Function類是直接繼承自O(shè)bject的。注意:builtin.as$0::MethodClosure這個類是不公開的,它雖然是Function的子類,但是它并不是動態(tài)類,因此一些高級函數(shù)技巧不能使用函數(shù)vartest:Function=functiontest()trace(Function);trace(使用函數(shù)表達(dá)式方法定義的test的類型不再是MethodClosure,而是一個Function-1Function-1FunctionFunction-1、Function-2、Function-3MethodClosure不同,是動態(tài)類,可以動、函數(shù)對vardrawPic:Function;vargraph:String="rect";if

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論