Flash AS高级知识:深入了解Function

高级

作者的Blog:www.kingda.org

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)类型。与主题扯远了,打住。

Function本质上到底是怎样的一种Object?

与其他编程语言不同,在AS中, Function是一个Object,可以有独立的属性甚至方法。比如arguments,callee,caller。在AS3.0中,Function还由更多的属性。
函数一旦执行,一个特殊的对象就建立了。我们称它为"active object",它含有以上的属性和本地变量。这个对象我们是不可访问的,属于内建的机制。同时,每个Function都含有一个内置的范围链(scope chain),这时也将被建立,以使Flash Player来检查所有的声明。函数可以层层嵌套,范围链也是如此。最大的范围链那当然是Global函数的范围链了,包括所有的全局变量和函数。

知道了Function 是Object又怎样?

会给我们带来极大的便利和编程思维的改变:
运用一:这是简单运用, 设立一个代理函数对象,根据条件的不同,将它指向不同的函数,实现动态改变。相信有经验的程序员都了解动态改变函数的便利性。而且由于AS提供了这种便利,运用这个特性可以衍生大量技巧。

var kingdaFunc:Function;
var sex:String = "male";
if ( sex == "male") {
 kingdaFunc = maleFunc;
} else {
 kingdaFunc = femailFunc;
}
kingdaFunc();  //输出: I am a boy

function maleFunc() {
 trace ("I am a boy");
}
function femaleFunc() {
 trace ("I am a girl");
}

运用二:建立函数执行队列。

比如说,我有一个对象,我想根据不同的情况对它进行一系列的操作。但是有时需要所有的操作,有时又只需要一部分的操作。那么这个较高级的技巧,就能保证代码的高度重用性和简洁。

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<execQueue; i++) {
 funcAry[i](originObject);
}

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

//操作步骤a,b,c
function aFunc(eO:Object) {
 eO.aFuncExected = true;
 trace ("aFunc()");
}
function bFunc(eO:Object) {
 eO.bFuncExected = true;
 trace ("bFunc()");
}
function cFunc(eO:Object) {
 eO.cFuncExected = true;
 trace ("cFunc()");
}

输出内容为:

aFunc()
bFunc()
cFunc()
cFuncExected:true
bFuncExected:true
aFuncExected:true

前三行表明a,b,c三个函数按顺序执行了。后三行表明orginObject确实经过了三步操作,多了三个为true的属性。

黑羽提醒:技巧可以再延深!
可以通过一个函数来管理队列里面各个元素的位置,达到改变操作函数的顺序。比如通过一个数组来安排调用顺序

var operationAry:Array = [2,1,0]
for(var i:Number = 0; i<operationAry.length; i ++) {
 funcAry[operationAry[i]](originObject);
}

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

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

未完,继续更新中,下一节介绍Function更深层次的运用:动态属性的运用

时间: 2025-01-26 18:00:40

Flash AS高级知识:深入了解Function的相关文章

Flash高级知识:用自定义类实现动画控制

高级|控制    这是高新技术等级考试Flash复习题中的一个问题,我在制作效果时没完全按照原题去做,主要是大家通过这个实例学会"用自定义类实现动画控制"的一些方法就行了.一.定义类在文本编辑器中输入以下的类定义代码,保存为:人.as  class 人 {  //属性定义  var 速度:Number = 1;  private var Personso:Sound;  public function 人(){   Personso = new Sound();  }  //移动MC的

Flash高级知识学习:ActionScript扫盲

高级 随着AS3规范的推出,很多Flash Developer也越来越想了解AS3,我的这篇文章应该可以在各位仔细观看AS3规范之前对ActionScript有一个扫盲级的了解,虽然是扫盲级,但是也不是类似于"hello!World"类型的文章,看了你就知道了. Action Script Action Script简称为AS,是Flash产品平台的脚本解释语言.该语言可以实现Flash中内容与内容,内容与用户之间的交互.AS的解释工作由Action Virtual Machine(A

Flash声音高级篇:NullSound技术-1

高级 原文出处:http://www.bluegelmedia.com 原作者:Brett E. Yokom / killersound, Inc 翻译:Jimbob 概要 本书介绍"NULLSOUND"stream技术的详细说明.该技术可以比传统的声音stream技术节约90%的文件体积大小,并保持声音和动画完全同步. 序言 我们先从Macromdeia Flash原有的技术的总览开始讲,后面再来描述具体实现的方法. 现在的互联网中,动画网站正在迅速的增长.人们已经不再满足于使用奇特

初步学用Flash的基础知识

我是去年暑假开始学FLASH,特俸上我研究的FLASH MX2004教程,送给那些和我当初一样想学FLASH而不得路的朋友们!!以下教程基本可以教会那些菜兄们基本的东西,你们只要会画,再学学下面的东西,应该足够了. 第一节 FLASH简介 什么是FLASH Flash是美国的MACROMEDIA公司于1999年6月推出的优秀网页动画设计软件.它是一种交互式动画设计工具,用它可以将音乐,声效,动画以及富有新意的界面融合在一起,以制作出高品质的网页动态效果. 为什么用FLASH 大家知道,HTML语

Flash声音高级篇:NullSound技术-2

高级 这些结果是有说服力的,假如我们制作一个"无声"版本(所有的动画保持原状,只删除了所有的声音)那么输出文件大小为655kb .如果我们比较一下两个文件的大小差异的话,结果说明采用str00方式的整个声音文件只占用59kb!!!而采用传统方式的话,音乐文件将占用595kb. 进一步说明:如果有5到6个2,3秒的声音文件,构成1,2,3分钟甚至更多时间,音乐文件占用的体积将低于70~80k.相对的,如果采用传统方法处理的话,占用文件大小将是1MB甚至更多. 下面介绍一下工作原理: st

FLASH网络游戏基本知识

网络 随便写点东西吧因为感觉人很少...会的不会的都来讨论下吧,这里太冷清...FLASH网络游戏主要解决的是和服务器的数据传输问题主要用到XMLSocket类sock=new XMLSocket(); sock.connect(ip,port);//服务器IP和端口 sock.send("");发送数据 sock.onConnect=function(success) {     if(success)     {          trace("成功!"):  

Flash ActionScript高级技巧:深入了解Function(2)

高级|技巧 呵呵,上篇帖子大家反映不错,短短几天被几家网站转载.http://www.webjx.com/htmldata/2006-06-15/1150354262.html 废话少说,这次继续上次话题.看看人气情况,如果大家喜欢我这个高级技巧专题,那么日后会陆续发布一些我自己这几年来项目开发笔记中的实用技巧. 利用函数返回函数:有一个proxyObject对象,我们希望根据proxy对象的内容来确定一个方法,来处理myObject对象.当proxyObject是字符串时,我们又希望根据它字符

flash 程序高级优化教程 二

7) 短变量名和长变量名 变量名越短,效率越高.考虑到长变量名也有它的好处(比如,便于维护等),因此建议在关键部位(比如大量循环出现的时候)使用短变量名,最好就1-2个字符. 8) 循环前.后声明变量 在测试前,我们认为循环前声明变量会更加节约时间,不料测试结果并不明显,甚至还恰恰相反! // 内部声明 t = getTimer() for (var i=0; i < MAX; i++) { var test1 = i } t1.text = "Inside:" + (getTi

Flash动画基础知识

Flash 就是一台动画机器.从Flash 最早的版本开始,就支持补间动画--只需要创建两个不同的关键帧,然后让 Flash 自动创建补间动画即可.本书将介绍 Flash 中的一种强大的语言 ActionScript.该书包括了编程,数学,物理等技术,并结合 ActionScript 让物体动起来,这些都是补间动画无法比拟的. 什么是动画? "动画"一词,引用美国传统词典中的解释 使有生命:充满生命力 给予兴趣:给予热情:使有活力 鼓励,激励:使充满精神.勇气或决心:鼓励 怂恿:驱使