ddc
联网
平面设计 画册 VI欣赏 包装 CG-插画 搜索 个人网页 Alexa排名 CSS 建站资源 下载专区 JS特效 品牌服装 服装院校 专题欣赏 SEO 图标欣赏 专题
上海网站建设 网站建设 域名注册 虚拟主机 广州网站设计 域名注册 广州网站建设 上海网站建设 虚拟主机 广州网页设计 虚拟主机 域名注册 acg ACG玩家 品牌设计
求创科技
网站建设
中国互联
投稿
素材出售
中国设计秀
中资源
当前位置:网络学院首页 >> 设计教程 >> Flash >> ActionScript高级技巧-深入了解Function

ActionScript高级技巧-深入了解Function (1)

来源:中国设计秀    作者:黑羽翔天    点击:102     加入收藏    发表评论
0
顶一下
Function究竟是什么?
我们习惯了function的存在,就像习惯了我们呼吸的空气却不去探究它的本质。看起来,似乎function和Number, Boolean, String一样都是ActionScript本来就有的类型

先看以下代码:

trace (aFunc);                    //输出:[type Function]
trace (aFunc instanceof Function); //输出:true
trace (aFunc instanceof Object);    //输出:true

function aFunc() {
  trace (“This is aFunc!Excuted!”);
}
第一行告诉我们aFunc的类型是Function, 第二行又证实了这一点aFunc确实是一个Function类型的实例,第三行更加有意思告诉我们aFunc是一个Object。

初学者可能很惊奇,其实AS2.0中除了原始数据类型Number, Boolean, String,undefined, null,其余全是Object. 而AS3.0中则更加极端,一切皆对象。包括原始数据类型也是Object,只不过是特殊的不变对象(immutable objects)类型。与主题扯远了,打住。:D
Function本质上到底是怎样的一种Object?
与其他编程语言不同,在AS中, Function是一个Object,可以有独立的属性甚至方法。比如arguments,callee,caller。在AS3.0中,Function还由更多的属性。
函数一旦执行,一个特殊的对象就建立了。我们称它为"active object",它含有以上的属性和本地变量。这个对象我们是不可访问的,属于内建的机制。同时,每个Function都含有一个内置的范围链(scope chain),这时也将被建立,以使Flash Player来检查所有的声明。函数可以层层嵌套,范围链也是如此。最大的范围链那当然是Global函数的范围链了,包括所有的全局变量和函数。


知道了Function 是Object又怎样?
会给我们带来极大的便利和编程思维的改变:
运用一:这是简单运用, 设立一个代理函数对象,根据条件的不同,将它指向不同的函数,实现动态改变。相信有经验的程序员都了解动态改变函数的便利性。而且由于AS提供了这种便利,运用这个特性可以衍生大量技巧。
<font face="Lucida Console" size="2"> 
var kingdaFunc:Function; 
var sex:String = &quot;male&quot;; 
if ( sex == &quot;male&quot;) { 
kingdaFunc = maleFunc; 
} else { 
kingdaFunc = femailFunc; 

kingdaFunc(); //输出: I am a boy 

function maleFunc() { 
trace (&quot;I am a boy&quot;); 

function femaleFunc() { 
trace (&quot;I am a girl&quot;); 

</font> 
运用二:建立函数执行队列。
比如说,我有一个对象,我想根据不同的情况对它进行一系列的操作。但是有时需要所有的操作,有时又只需要一部分的操作。那么这个较高级的技巧,就能保证代码的高度重用性和简洁。
<font face="Lucida Console" size="2"> 
var funcAry:Array = new Array(); 

//将需要的操作步骤加入队列 
funcAry.push(aFunc); 
funcAry.push(bFunc); 
funcAry.push(cFunc); 

//供操作的对象 
var originObject:Object = new Object(); 

//需要执行几步由execQueue这个参数决定,在实际工程运用中这个数可能是动态决定的。 
var execQueue:Number = funcAry.length; 

/核心步骤:/函数队列执行。实际运用中可以把它包装成一个函数,或者一个类的实例。 
for (var i:Number =0; i&lt;execQueue; i++) { 
funcAry[i](originObject); 


//trace出执行操作后的originObject里面的内容 
for (var i in originObject) { 
trace ( i + &quot;:&quot; + originObject[i]); 


//操作步骤a,b,c 
function aFunc(eO:Object) { 
eO.aFuncExected = true; 
trace (&quot;aFunc()&quot;); 

function bFunc(eO:Object) { 
eO.bFuncExected = true; 
trace (&quot;bFunc()&quot;); 

function cFunc(eO:Object) { 
eO.cFuncExected = true; 
trace (&quot;cFunc()&quot;); 

</font> 
输出内容为:
<font face="Lucida Console" size="2"> 
aFunc() 
bFunc() 
cFunc() 
cFuncExected:true 
bFuncExected:true 
aFuncExected:true 
</font> 
前三行表明a,b,c三个函数按顺序执行了。后三行表明orginObject确实经过了三步操作,多了三个为true的属性。

黑羽提醒:技巧可以再延深!
可以通过一个函数来管理队列里面各个元素的位置,达到改变操作函数的顺序。比如通过一个数组来安排调用顺序
<font face="Lucida Console" size="2"> 
var operationAry:Array = [2,1,0] 
for(var i:Number = 0; i&lt;operationAry.length; i ++) { 
funcAry[operationAry[i]](originObject); 

</font> 

这样函数就通过2,1,0这样的倒序来执行操作。

这个技巧还有很多可以延伸的地方,比如说动态控制操作函数的参数等等,供大家自己研究扩展。 

[1] [2]
2006-06-19 11:43:00    出处:flash8
Google
热点文章/相关文章

音乐
嫁衣 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 没有人比我更爱你
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 明天过后 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 降临 下雨天 小酒窝 樱花草 恋爱新手 说唱脸谱 红色高跟鞋 寂寞才说爱 深深爱过你 爱上你是个错 即使知道要见面 不是因为寂寞才想你
城府 假如 花海 兰亭序 棉花糖 舍不得 最后一次 女人如烟 外滩十八号 我们的纪念 我们的无奈 心在跳情在烧 爱上你是我的错 爱情里没有谁对谁错
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明 | 网站公告 | 友情链接 | 留言 | 旧版入口