各种-actionscript3.0之函数首先声明这不是我教程以下内容来源于殿堂路、帮助文_第1页
各种-actionscript3.0之函数首先声明这不是我教程以下内容来源于殿堂路、帮助文_第2页
各种-actionscript3.0之函数首先声明这不是我教程以下内容来源于殿堂路、帮助文_第3页
各种-actionscript3.0之函数首先声明这不是我教程以下内容来源于殿堂路、帮助文_第4页
各种-actionscript3.0之函数首先声明这不是我教程以下内容来源于殿堂路、帮助文_第5页
免费预览已结束,剩余30页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ActionScript3. 之函首先这不是我的。以下内容来源于《殿堂文纳和整理,很多例子和解释文字都是对其他老师的代码和文字进行了原文的,在些也感谢黑羽老师及其它网络上的老师为flas所做出的贡献。function{trace("o!Howare}定义是:函数是执行特定任务并可以在程序中重用的代码块。ActionScript3.0中函数为分两类:方法(Method)和函数闭包(Functionclosures此换句话说,函数是一种将调用时才执行(不调用不执行)某函数成为了AS进行修改的中心点。在函数中做个修改,该修改就能被应用编写成函数可以在许多程序中重复使用。因此,可以开发出一个可被用定义,但直到或调用它之前什么也不会发生。可以自己测试一下这一点,即在主时间轴的第1帧中,用如下代码创建一个新的Flash影片:function{trace("o!Howare}当测试该影片时会看到,尽管在代码中有一个trace()动作,但什么也没greeting():void{trace("o!Howare}Outputo!Howaretrace()Flashtrace("Usetracetohelpdebugyour没有参数的Math.random()方法来生成一个随机数:varrandomNum:Number=个函数。函数有两种定义方式。一种是我们非常熟悉的函数语句定义法(Functionstatement)ActionScript特有的函数表达式定义法(Functionexpressionfunction函数名(参数1:2:}function{returna+}上面那样包括function关键字。的数据的类型。在后面会讲到如何返回数据。使用void函数表达式定义法是ActionScript特有的一各定义方式。定义格式如下:var:Function=function1:2:参数类型,……):}注意=号右边的内容function后面没有跟随函数名,这相当于创建了一个函数对象并将赋值给了左边的函数型变量这种方法经常被中、var{returntest1:Function=function():void{trfunctiontest2():void}varmyArray:Array=newArray();myArray[0]("My除此之外,函数语句定义法和函数表达式定义法还体现在函数体中this关键字的上。使用函数语句定义法,则this关键字牢牢指向当前函数定义的域;而若使用函数表达式定义法,则随着函数附着的对象不同,this关键字也随之改变。这里不做深入探讨,有的朋友中以看一下《殿堂》,里面有数的传递给外部代码,否则嵌套函数将仅在其父函数内可用。例如,下面的代码在greeting()函数两个嵌套函数:function{function{return"}function{return"新好}return(greet()+""+}//输出 o!新好如,如果greeting()函数可以使用不同的来显示个性化的问候,就会使 }greeting("");//显示:o!Howareyou?greeting("");//显示:o!Howareyou?在greeting()函数中所看到的那样,参数被命名为“names”,在每次调用该函数定义的圆括号中的。大家可能注意到了,参数的与常规变量的相下面的代码是不正确地参数的例子,将产生错误://不能使用var关键字。 names:String):void{trace("o."+namgreeting(names:String;):void{trace(}在as3中可以在圆括号中初始化变量,这是正确的写法,也是与as2最大functiongreeting(names:String=""):void{trace("o!}test()函数的例子functiontest(names:String,weight:Number):void{}test("",50)//显示:的体重是Actionsfunctiontest(names:String,}test("",50);//显示:的体重是function(1:类型=2:类型=//函数语}function{}test();//输出:6321test(9);//输出:12921test(2,9);//输出:12291test(1,2,3);//输出:6123、参数和正确传入参数要么参数被为圆括号中的参数列表。但是,不管一个函数是否了任何参数,argumentsargumentsarguments变量(对象,当arguments[0]、arguments[1]传入的第一个参数、第二个参数,依次类推。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所的将是该参数,而不是arguments对象。下面的代码不生成输出结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调用自身可以避免因为改动部分的函数名但忘了改动函在as2中可以不用管函数的定义格式,可以传入任意多个参数。但在as3function{}test();//输出:参数个数不正确。应为3个test(9);//输出:参数个数不正确。应为3个test(2,9);3test(1,2,3,5);//报错:参数个数不正确。不应超过3个test([3,4]);//报错:Array类型值的隐式强制指令的目标是非相关类型function{}test();//输出:632test(9);//输出:1292test(2,9);//输出:1229test(1,2,3,5);/3个function{}functiontest(a:int,b:int=2,c:int=1):void{}为了提供传入任意参数的灵活性,as3提供了一个新关键字...rest。那么只要在参数中定义了...rst,那么就可以传入任意多的参数了。这些参数以数组的形式保存在restrest只是推荐名,我们可以改成它的名字,比如prasrst关键字,那么argumns就不能再使用了。尽管...rst参数提供了与argumns数组和rument.lengh属性相同的功能,但是它不提供与argmentscallee类似的功能。使用...rest参数之前,应确保不需要使用rgumets.calee。看下面的例子:functionfor(variinrest){}}testA(1,[5,9],"新好参数的长度1新好...rest参数还可与其它参数一起使用,前提是它必须是最后一个列出的参testB()函数的第一个参数names是String类型,第二个参数使用...rest...restfunctionfor(variinrest){}}testB("新好",[50,3],534,"你好参数的长度可以看出:实际“新好”并没有输出,要想输出,只有再加上语trace(names)五、按值还是 当给函数传入参数时,参数是用两种方式之一进行传递的:按值和按。其区别与数据类型有关。按值传入,那么参数对象会一份副本供函数操作,用,那么会改变参数的状态。实际上,在AS3中,所有的参数都是按来传入。AS3Boolean、String、int、uint和Number。这function{return}varvarc:Number=test(a);Output窗口会显示如下内容:56在这个例子中,尽管变量a的值被传递给了函数,并且那个值在函数中被增1,a5aac直接存值。每个变量不因为其它变量的值的改变而改变。即使形参a名与变量a名完全相同也是如此,因为函数的a将指向内存中的新位置,这些位置不同于函数外部同名的变量a所在的位置。、当复杂数据类型被作为参数传递时,它们是按进行传递函数中对对象所做的任何事情都会影响到该对象本身,没有产生该对象的副本。MovieClip等等。下面看一下复杂数据类型作为参数传递时的情况。例1:以Arrayfunction{num=100;}varvarb:Array=[1,2,3];trace(a);//输出:5a100,trace(b);//输出:输出:15,2,3,100b例2:以Object为例: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。该对象作为参数传递给test()函数。因为该对象不是基元类型,所以它不但按传递,而且还保持同一个。这意味着对函数的参数的更改将会影响到函数外部的对象属性。returnreturn当使用return语句从一个函数返回一个值时,应该指定要被返回的数据类型(在函数定义的圆括号后面指定。在此之前的例子中,返回类型是void(表示无返回。但是,当返回一个字符串时,就应该将返回的数据类型设置成String;Number,等等。function{varreturn}function{varreturn}trace(rectArea(3,5));//报错:String类型值的隐式强制指令的目标是非相关类型Number。只要用到return语句,Flashreturnfunction{varreturntrace("Thearea}在上面的例子中,trace("Theareais:"+Area)语句总是不会被执行。这是returnreturnfunction{for(vari:Number=0;i<myArray.length;i++)//如果成员之一匹配string的值,就返回相应的索引。这会导致该函数停if{return}}returnmyArray.length;}vararray:Array=[1,"ab",34,"efg",28.5];varnum:Number=test(array,"efg");//varnum:Number=test(array,"a")很明显,在任何对该函数的调用中,只可能遇到其中的一个return语句。returnreturnforVararea:Number=rectArea(6,3);//返回值存入变量vararea:Number=rectArea(6,3)*5下面的内容是有效的,然而却是不太有用的ActionScript语句functionrectArea(Width:Number,Height:Number):Number{return}if{trace("}elsetrace("面积小于}MovieClip、Function等等。七 函合起来使用时,函数就被调用了,但是名字本身只是作为对函数的。这就是说,function{varreturn}varfArea:Function=rectArea;“作用域”是在ActionScript中定义的某些标识符的作用范围。有些标识某个部分定义的变量。在ActionScript3.0中,始终为变量分配它们的函当在一个函数中适当地一个变量时,该变量就被称为“局部变量”。局functiontest():void{vargreet:String="o!howareyou?";}trace(greet);//输出:的属性greet未定functiontest(string:String):void{} o!");//输出:trace(string);//输出:的属性string未定与局部变量不同的是,全局变量是在任何函数或类定义的外部定义的变量。在该函数外面的变量(但在定义该函数的相同时间轴中)是可以在该函数中使function{}varstring:String="o!";trace(string);//输出:o!在该例子中,变量string是在该函数之外的,但仍可以在该函数之中使用。从该示例可看出,全局变量在函数定义的和外部均可用。如果用于局部变量的变量名已经被为全局变量,那么,部变量在作用strtest()trace外部的trace语句则输出该变量的全局值。varstr:String="global";functiontest(){varstr:String=trace(str);//}trace(str);//在全局作用域中的函数在整个代码中都可用。例如,ActionScript3.0包含可在代码中的任意位置使用的全局函数,如trace()和int()。嵌套函数(即在另一个函数中的函数)可以用在它的函数中的任意位置。当在时间轴中声functiontest():voidif(this.currentFrame==1)}else}}然后在主时间轴第30帧关键帧,再次调用函数可以在它的时间轴的任意地方、任意时间调用。在相同的时间轴中使用该函数,function}把写有函数的空的影片剪辑拖到主场景中间,起实例名mc,//输出:1180:调用的方法circle可能未定义。circle()mc//输出:1180:circle//输出:1061circle(通static类型DisplayObjectContainer)this.parent返回的是DisplayObjectContainer对象,DisplayObjectContainer不是动态类,需要进行类型的转换,所以用MainTimeline(this.parent)转换之后便可以使用。在没绑定文档类的情况下,MainTimeLineflashMovieClip,也是动态类,并成为stage对象的唯一子对象。因为MainTimeline是动态类,可以动态填加方法,MainTimeline(this.parent).circle()就等于给主时间轴实例动态填加了circle()方法(理解的,不知对不对。下面几种写法也可以:因为主时间轴类MainTimelineMovieClipMovieClip(this.parentasn*(n-1)*(n-2)…*1例如,51205*4*3*2*1)。下面就是一个完functionfactorial(n:Number):Number//我们把x>0if(n>0)1(否则就成死循环了)returnn*factorial(n-1);}elsereturn}}trace(factorial(5));//输出单些:trace(factorial(3));当第一次调用factorial()函数时,是用3这个值进行调用的。因为n大于0,所以它执行if语句中的语句。该语句指示函数返回表达式n*factorial(n-1)的值。为了计算该表达式,该函数必须调用它自己(factorial(n-1)factorial2同样,n的值大干0,所以执行第一个return语句。该函数再一次调用它自己。这一次,是用1这个值进行调用的。重复相同的处理,再一次用O这个值调用factorial()。然而,在这次函数调用时,因为n不再大于01并且不再调用该函数了。应该非常,以确保递归函数在递归的次数上有一个限 {returnn*factorial(n-} Flash对此有一个保护措施,即在一个设定的递归次数之后,会在影片中ActonScrpt。如果在影片中使用了这种无限递归(即没有一个条件能使该递归停止)的函数,当测试影片时就会在Output窗口中看到警告信息。function{if(x>0)returnx*x+squareSum(x-}elsereturn}}在许多情况下这可能是有用的。例如,可能有一个名为area()的函数,它基于两个参数(各个边的长度)来计算矩形的面积。但可能还希望有一个area()函数,ifswitcharguments.length决定)计算矩形的面积或者圆的面积。这并不是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(数组的长度我们知道:函数只是一段可执行代码,编译后就“”了,每个函数在内存中只有一份实例,得到函数的点便可以执行函数了。函数可以作为另一个函数的参数或返回值,可以赋给一个变量。函数可以嵌套定义,即在一个函数内还是来看一下帮助文档上的例子:下面的代码创建两个函数:foo()(返回一个用来计算矩形面积的嵌套函数ectAra()和bar(调用foo()并将返回的函数闭包在名为yProdct的变量中。functionfoo():Functionvarx:int=function{returnx*}return}function{varx:int=2;vary:int=4;varmyProduct:Function=//相当于:varmyProduct:Functiontrace(myProduct(4}bar();//输出我是这样理解的(不一定对呀:在bar()函数中,首先调用foo()函数,foo()函数执行后返回rectArea函数对象,并把rectArear函数的附值给myProduct。然后调用myProduct(4)并执行,由于myProduct和rectArea持有同一个,所以调用myProduct(4)就等于调用rectArea(4),也就是计函数的定义域(是不是也可以理解为“词汇环境”)是在boo()函数中,所以rectArea函数保留它作用域中的所有变量、属性、方法和对象以及它们的值,也就是xbarx(2),当调用函数闭包myProductfoo()中定义的变量x(40。因此,bar()函数将返回值160,而不是8。前面已经学过如何在ActionScript中创建一个自定义函数了。通常,当人们谈到函数时所指的就是这些自定义函数。但是,在ActionScript中还有许多(trace()――traceflashisNaN()――NaN(非数字true。isNaN()函数可用于检查一个数字表达式是否成功地计算为一个数字。NaN值是Number数据类型的特函数究竟是什么?ActionScript3.0中的函数是对象。当您创建函数时,ActionScript3Function作为参数传递给另一个函数的函数是按(而不是按值)传递的。在将某functiononframe(e:Event){}实际上,每个函数都有一个名为length的只读属性,它用来为该函arguments.lengthActionScriptfunctiontest(x:uint,y:uint):void{trace("argumentsarguments.length);trace("arguments需要收到的参数数量:"+test.length);}test(1,3,56,arguments实际收到的参数数量:4arguments需要收到的参数数量:2如果要在严格模式下进试,必须用函数表达式方法来test()函数,vartest:Function=function(x:uint,{trace("arguments实际收到的参数数量:"+arguments.length);trace("arguments需要收到的参数数量:"+test.length);test(1,3,56,这回test(1,3,56,890)函数在严格模式和标准模式下都可运行。我们可下面的test()函数是用函数语句定义法定义的函数:functiontest(){}trace(Function)trace(testMethodClosure类对象;第二行输出告诉我们这个神秘的MethodClosure类的父类是Function;第三行确testFunctiontestObject。因Function类是直接继承自Object的。注意:builtin.as$0::MethodClosure这个类是不公开的,它虽然是Function的子类,但是它并不是动态类,因此一些高级函数技巧不能使用函数vartest:Function=functiontest()trace(Function);trace(使用函数表达式方法定义的test的类型不再是MethodClosure,而是一个Function-1Function-1FunctionFunction-1、Function-2、Function-3MethodClosure不同,是动态类,可以动、函数对vardrawPic:Function;vargraph:String="rect";if

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论