网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月26日漏签0天
奕帆吧 关注:71贴子:1,468
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 6回复贴,共1页
<<返回奕帆吧
>0< 加载中...

【flash8 ActionScript】使用函数

  • 只看楼主
  • 收藏

  • 回复
  • 啾啾鸣虫
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
函数是一种革新。写代码没有函数,就象出版图书没有印刷机。 
函数是一种组织起一个代码块的方法,该代码块直到从其主流程序中调用(直接地或间接地)时才执行。换句话说,函数是一种将调用时才执行(不调用不执行)某个特殊任务的代码块包装在一起的方法。 

*写一个函数也被称为“定义”或“声明”一个函数。自定义函数的语法: 
function functionName():datatype{ 
statements 
} 

关键字function告诉flash,正在声明一个函数,冒号后面是一个有效的数据类型名字,数据类型是函数将返回的数据的类型。无返回值,就使用Void名字。 

写一个简单的函数例子: 
function displayGreeting():Void{ 
trace("Hello."); 
} 

*调用函数  
我们将术语“函数”定义为延迟执行的代码块。这就是说,一个函数可以被定义,但直到访问或调用它之前什么也不会发生。 
  
为了调用一个函数,需要使用该函数的名字,并后跟一个圆括号(函数调用运算符)。当调用一个函数时,对函数的调用本身就是一个语句。因此,应该在该语句后面使用一个分号。 
下面的例子定义了一个函数,然后调用它。如果想自己学习和测试它,只需将该代码放置在主时间轴第1帧即可。 
function displayGreeting():Void{ 
trace("Hello."); 
} 
displayGreeting(); 
当测试该影片时,在Output窗口中显示如下内容:Hello. 

*传递参数 
上述的例子中,displayGreeting()函数不需要任何参数。 
ActionScript并不强求定义函数时的参数列表与调用时传递给该函数的参数个数一致。所以从技术上讲,displayGreeting()函数并不“要求”任何参数。也就是说,尽管并没有给一个定义了参数列表的函数传递任何参数,Flash在编译该代码时也不会出错。但是,这并不是说,函数就会像期望的那样工作。如果没有给它传递它所期望的参数,它很可能就不会正常工作。 

许多函数需要给它们传递参数。例如,如果displayGreeting()函数可以使用不同的姓名来显示个性化的问候,就会使displayGreeting()函数更加有趣了。有了参数,实现这一点就简单了。修改后的函数如下所示: 
function displayGreeting(sFirstName:String):Void{ 
trace("Hello,"+ sFirstName); 
} 
一旦使用这种方式定义了该函数,就可以调用它了,并给它传递不同的参数值。 
displayGreeting("Joey");//显示:Hello,Joey 
displayGreeting("Robert");//显示:Hello,Robert 

参数(变量)是在函数定义的圆括号中声明的,声明时需要给变量创建一个名字并定义一个数据类型。和变量声明有些类似,但声明参数时不需要使用Var关键字,并且不能在圆括号内初始化一个参数。 

如果想在函数中使用多个参数,可以使用逗号分隔开多个参数。同样的,当调用该函数时,可以给它传递多个值,只需简单地用逗号分隔这些值。 
例如: 
function displayGreeting(sFirstName:String,sGreeting:String):Void{ 
trace("Hello,"+sfirstName+","+sGreeting); 
} 
displayGreeting("Joey","Good morning."); 
//显示:Hello,Joey.Good morning. 

当开始将越来越多的参数添加到一个函数定义的参数列表中时,代码就开始超出编辑器的边界了,这时可以在Actiong面板中开启自动换行功能,但通常采用将每个参数或参数组放置到单独的一行,这样增强可读性。 


  • 啾啾鸣虫
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
*从函数返回一个值 

到现在为止,主要介绍了函数作为子程序的这一点。也就是说,函数可以将主程序分解为更小的,更易管理的片段。一方面,当用那种方式作为一个子程序时,函数并不需要返回一个值。另一方面某些时候想创建一个函数,用它进行某些计算或操作,然后返回一个值。可以在一个函数中使用return语句来返回一个特定的值。语法如下: 
return value; 
当使用return语句从一个函数返回一个值时,应该指定要被返回的数据类型(在函数定义的圆括号后面指定)。在此之前的例子中,返回类型是Void。但是,当返回一个字符串时,就应该将返回的数据类型设置成Srting;当返回一个数字时,就应该将返回的数据类型设置成Number,等等。 
下面是一个计算矩形面积的函数的例子,其返回值是数字: 
function calculateArea(nA:Number,nB:number):Number{ 
var nArea:Number=nA*nB; 
return nArea; 
} 
只要遇到return语句,Flash就退出该函数。因此,如果在return语句后面还有其他代码,就不会再执行它们了。 

下面是一个使用几个return语句的例子。明显地,在任何对该函数的调用中,只可能遇到其中一个return语句。该函数用一个for语句来搜索遍历该数组,直到遇到一个与该字符串匹配的成员为止。一旦发现匹配,它就返回相应的索引。如果没有发现匹配,该函数就返回null. 
function findMatchingIndex(nTitles:array, 
 sTitle:string):Number 
{ 
 for(var i:number=0;i<aTitles.length;i++){ 
//如果成员之一匹配Stitle的值,就返回相应的索引。这会导致该函数停止执行。 
 if(aTitles[i]==sTitle){ 
 return i; 
 } 
} 
//如果没有发现匹配,就会遇到这条语句(仅此而已)。 
return null; 
} 

不管函数做什么,只要它返回一个值,就完全可以将其作为表达式的一部分来调用该函数。例如 
var nArea:Number=calculateArea(6,6); 
我们希望按某些有意义的方法来使用返回的值。可以使用变量那样来使用一个会返回值的函数。在下面的例子中,函数作为条件表达式的一部分使用: 
if(calculteArea(6,6)>18){ 
trace("The area is more than 18."); 
} 

*引用函数 
可以用函数的名字来引用一个函数。当将函数名与函数调用运算符(圆括号)结合起来使用时,函数就被调用了,但是名字本身只是作为对函数的引用。这就是说,实际上可以使用函数的名字来将一个引用赋予一个变量。例如,一旦将对一个函数的引用赋给一个变量,就可以将那个变量名与函数调用运算符结合起来调用那个函数。例如: 
function calculateArea(a:Number,b:Number):Number{ 
var nArea:Number=a*b; 
return nArea; 
} 
var fArea:Function=calculateArea; 
trace(fArea(6,6)); 

*创建匿名函数 
现在已经知道如何使用标准的、命名的函数语法来定义函数了。除此之外,还有一种使用“匿名函数”来定义函数的方式,它允许创建一个没有名字的函数。然后,可以将该函数赋予一个变量。 
下面是匿名函数的语法: 
function():datatype{ 
statements 
}; 
匿名函数没有函数名,匿名函数后跟一个分号。这在标准函数的声明中是不需要的。 
正如前面所述,这主要是想将匿名函数赋予一个变量。否则,当该函数定义之后,它就离开了作用域,即变成未定义的了。下面是一个将匿名函数赋予一个变量的例子: 
var fSayHi:Function=function(sName:String):void{ 
trace("Hi,"+sName); 
}; 
fSayHi("Joey");//显示Hi,Joey 
就象所看到的那样,可以使用被赋予该匿名函数的变量来调用该匿名函数。


2025-06-26 17:18:57
广告
  • 啾啾鸣虫
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
*理解作用域 
“作用域”是在ActionScript中定义的某些标识符的作用范围。有些标识符仅在一个时间轴中被定义,有些标识符在整个影片的范围中被定义,有些标识符仅在一个函数中被定义。在函数中,有两作作用域需要解释一下:变量的作用域、函数的作用域。“变量的作用域”是变量在一个函数中的作用范围。 

*变量的作用域 
当在一个函数中适当地声明一个变量时,该变量就被称为“本地变量”。本地变量表示当在一个函数中声明一个变量时,它的定义在该函数调用之后就不再保留。这是一种避免与其他变量产生命名冲突的好方法。 
下面是一个的例子,它声明并初始化了一个名为smessage的本地变量。该本地变量在该函数中被定义,但是,如果想使用trace()在该函数之外来显示该变量的值,结果将是未定义的。 
function testScope():Void{ 
var amessage:String="hello,world!"; 
} 
testScope(); 
trace(sMessage);//显示:undefined 

在一个具有许多函数的大程序中,使用本地变量有得确保减少具有相同名字的变量之间的冲突。尽管总是应该试图为变量取一个惟一的名字,但是在不同的函数中重复使用相同的变量名字还是可能的。如果每个都有相同的作用域,那么一个就会干扰另一个,就会导致不希望的值和结果。另一个使用本地变量的可能原因是用于内存管理。尽管它可能并不是真的很大,但在程序中定义的每个变量都会占用内存。如果不用一个变量做什么事了,但它仍被定义,就会浪费内存。通过使用本地变量,当函数结束之后内存就会被释放。 
参数被看做本地变量,即其作用域在该函数中,但不在它之外。从下面的例子就可以看出这一点: 
function testparameterScope(sMessage:String):viod{ 
trace(sMessage); 
} 
testParameterScope("Hello");//显示:Hello 
trace(sMessage);//显示:undefined 
与此相反,在该函数外面声明的变量(但在定义该函数的相同时间轴中)是可以在该函数中使用的,例如: 
function testScopeTimeline():void{ 
trace(sMessage); 
} 
var sMessage:String="Hello"; 
testScopeTimeline();//显示:Hello 
在该例子中,变量smessage是在该函数之外声明的,但仍可以在该函数之中使用。 

*函数的作用域 
正中现在所知,当声明一个函数时,其作用域被限制在声明它的时间轴中。这就是说,可以通过它的名字在相同的时间轴中调用它;如果使用一个目标路径,那么就可以在那个时间轴之外调用它。在相同的时间轴中使用该函数,就有些不方便了。在一个没有时间轴的对象中使用该函数就变得颇具挑战性了。


  • 啾啾鸣虫
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
*创建递归 
递归是指一个函数在其函数体中调用这自己。经典实例:计算一个数的阶乘。数n的阶乘:n*(n-1)*(n-2)*...*1 
下面是一个完成这一工作的函数: 
function factorial(nOperand:Number):Number{ 
if(nOperand>0){ 
return nOperand*factorial(nOperand-1); 
} 
else{ 
return 1; 
} 
} 

有些函数有可能发生无限循环,比如将上面的函数中if条件限制去掉,变为: 
function factorial(nOperand:Number):Number{ 
return nOperand*factorial(nOperand-1); 
} 
这个函数的无限循环将导致系统崩溃。 
幸运的是flash对此有一个保护措施,即在一个设定的递归次数之后,会在影片中禁止ActionScript。如果在影片中使用了这种无限递归的函数,当测试影片时就会在Output窗口中看到类似的信息: 
256 levels of recursion were exceeded in one action list. 
This is probably an infinite loop. 
Further execution of actions has been disabled in this movie. 

*重载函数 
重载函数是指,使多个函数具有相同的名字但具有不同数量和/或类型的参数。在许多情况下这可能是有用的。例如,可能有一个名为calculateArea()的函数,它基于两个参数(各个边的长度)来计算矩形的面积。但可能还希望有一个calculateArea()函数,它基于一个单独的参数(半径)来计算圆的面积。问题是,正如已经提到过的那样,ActionScript并不要求函数定义中的参数数量与传递给它的参数的数量一致。这就是说,不能有两个具有相同名字的函数,即便它们有不同数量的参数。因此不能真的有ActionScript来重载函数。 
相反,可以在函数中使用if语句或switch语句来检查参数的数量而模仿函数的重载。下面是一个例子,它说明可以如何写一个函数,使其根据传递给它的参数的数量(由arguments.length决定)计算矩形的面积或者圆的面积。这并不是一个严格意义上的重载函数,而是ActionScript的等价物。 
function calculateArea():Number{ 
switch(arguments.length){ 
case 1: 
var nRadius:Number=arguments[0]; 
return (Math.PI*(nRadius*nRadius)); 
case 2: 
var nA:Number=arguments[0]; 
var nB:Number=arguments[1]; 
return(nA*nB); 
default: 
return null; 
} 
}


  • 啾啾鸣虫
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
创建间隔函数 

可以用函数来做的一件非常有用的事情就是:利用setInternal()命令创建间隔函数。通过使用setInternal()函数可以指定一个函数和一个连续调用该函数的时间间隔(以毫秒为单位)。该函数返回一个ID(标识),该ID可以被用于稍后停止该间隔。下面是setInterval()函数与一个函数一起使用时的标准语法: 
setInterval(function,interval[,param1...,paramN]) 

setInterval()函数的第1个参数应该是一个函数的引用。这就是说,不应该包含函数调用运算符。换句话说,如果将setInterval()与自定义函数writeMessage()一起使用,那么setInterval()的第1个参数应该仅仅是writemessage。 
interval以毫秒为单位。如果给interval参数传递1000,则该函数将大约每秒钟被调用一次。但是要知道,函数被调用的间隔并不精确。Flash尽可能地按间隔来调用函数。但是,运行播放器的计算机的处理与间隔应该多么精确之间是有冲突的。 
通过使用setInterval()动作,可以随意地给函数传递参数。紧接在头两个参数(必需的)之后传递给setInterval()的任何参数,都将接着传递给函数。例如,下面的例子显示了一个使用两个参数的writemessage()函数。通过使用setInterval()可以告诉Flash,每隔1000毫秒就调用该函数,并将两个值传递给该函数: 
function writemessage(sName:String,sMessage:String):Void{ 
trace("Hello,"+sName+"."+sMessage); 
} 
var nWriteInterval:Number=setInterval(writeMessage,1000,"Joey","Good morning."); 

Flash开发者在使用setInterval()时常犯一个错误是:认为会在每次调用函数时计算通过setInterval()传递给该函数的变量。例如,上面的代码可能被重写成: 
function writemessage(sName:String,sMessage:sMessage:String):Void{ 
trace("hello,"+sName+"."+sMessage); 
} 
var sNameParam:String="Joey"; 
var sMessageParam:String="Good morning."; 
var nWriteInterval:Number=setInterval(writemessage,1000,sNameparam,sMessageParam); 
用户可能认为:改变sNameParam和/或sMessageParam的值将导致在Output窗口中显示不同的值。但是,在每次调用writeMessage()函数时,并没有计算变量sNameParam和sMessageparam的值。相反,当调用setInterval()时,才计算它们一次。然后那些值就被用于每次调用该函数。因此,尽管改变了这些变量的值,但传递给该函数的仍是相同的值。 

下面的例子,可以用来检验Flash调用间隔函数的精确性。可以将该代码放置在一个新的Flash文档的主时间轴的第1帧中。 
function traceTimer():Void{ 
trace(getTimer()); 
} 
var nTimerInterval:Number=setInterval(traceTimer,200); 

该函数有规律地、按大约200毫秒的间隔被调用。但间隔是不精确的。 

如果用setInterval()来影响舞台中的动画的话,帧速率也可能对如何使用setInterval()产生影响。影片刷新舞台的速率只在视觉上等于该影片的帧速率。这就是说,如果在该影片中某些处理发生的速率高于帧速率,它就不会对舞台中的显示有影响。因此,假如用setInterval()来将一个MovieClip实例移动越过舞台,并且帧速率被设置成1fps时,然而该函数被调用的间隔却是10毫秒, 那么在舞台上的移动就可能起波浪。 

清除间隔 

通过调用clearInterval()函数可以使一个正在被不停调用的函数停下来。clearInterval()函数使用一个单独的参数,即表示应该被清除的间隔的ID。 
setInterval()会返回一个可以被用于指示该间隔的ID。 
下面的代码停止一个间隔。该间隔的ID已经被赋予nTimerInterval了: 
clearInterval(nTimerInterval);


  • 啾啾鸣虫
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
.函数是一种将代码块组织到一起的方法,可以通过名字或引用来调用它们,从而一遍又一遍地使用它们
.函数可以作为子程序,即它们可以执行某些运算并返回一个值
.函数可以被命名,也可以匿名。这两种类型都有不同的优点和缺点。
.通过使用为函数创建的arguments对象,可以调用一个调用函数,递归地调用一个匿名函数,并且按数组而不是按单独的各个变量来使用传递给函数的各个参数。
.定义可以在许多不同环境中使用的通用函数是值得的。


  • 啾啾鸣虫
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
当谈到函数时所指的一般是自定义函数。但是,在actionscript中还有许多其他“内置函数”,基本上可以象使用自定义函数那样使用它们。
actions工具箱中含一个名为Global Functions的文件夹,在这个文件夹中是包含所有内置函数的子文件夹。这些函数中的许多已经被类和方法代替了,因此最好使用这些新的替代品。例如,所有的时间轴控制、影片剪辑控制和打印函数都已经被方法代替了。但仍有某些全局的内置函数是有用的。这些函数包括:
fscommand()--仅在非常特殊的情况下才使用这个函数。fscommand()函数能使flash影片与播放器进行通信。
setInterval()/clearInterval()--指示flash按特定的、固定时间间隔去调用其他函数。
escape()/unescape()--被用于在文本和安全URL格式之间进行转换。
getTimer()--返回自从Flash影片开始播放以来的毫秒数。这在某些定时处理(不要求很高的准确性和精确性)中可能有用。例如,想在影片“时间到了”之后做某些循环,在这些情况下,getTimer()就是一个合适的函数。例如,可能有一个等待来自服务器的响应的影片,但是,如果30秒钟之后还没有得到响应,可能就想停止等待并提醒用户服务器没有响应。
trace()--测试Flash应用程序显示信息
isFinite()/isNaN()--测试一个值是否是有限的,甚至是否是一个有效的数字。
parseFloat()/parseInt()--从一个字符串中解析一个数字。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 6回复贴,共1页
<<返回奕帆吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示