1、在as3中,可以大致把函数分为两类:方法和函数闭包,分类依据是函数定义的上下文。
- 方法 :将函数定义为类的一部分,这个就类似于java中的类的方法。或者将它附加到某类的实例上,动态类有这个功能,其实javascript中也有类似用法。
- 函数闭包 :其它的任何定义方法。和javascript中用的最多的定义方法类似。
2、定义函数的两种方式:函数语句和函数表达式 ,javascript中也有,不细说,举两个例子:
//函数语句声明
function fun1():void{}
//函数表达式声明
var fun2:Function = function():void{}
3、在非动态类 中,以函数表达式声明的方法,在严格模式下 是不能用.运算符访问的,但可以用[]访问。
class Test{
var fun1 = function():void{}
}
var t:Test = new Test();
t.fun1(); //严格模式下报错
t["fun1"](); //正确
4、在动态类中 ,用函数表达式声明 的方法,是可以用.运算符访问 的。但动态类有一个不好的地方:访问一个动态类实例没有的属性,并不会生成编译器错误。
5、函数语句声明的函数是不能被垃圾回收的;函数表达式声明的函数,当失去对它所有的引用后,就会被垃圾回收。
比如: 当以函数表达式的形式声明一个函数为一个动态类实例的属性,而我们用delete操作符删除这个属性时,我们声明的函数也被回收了。
var t:Test = new Test(); //t是动态类Test的一个实例
t.funt = function(){}; //把一个函数声明为t的一个属性
delete t.funt; //删除刚才新增的函数,我们刚才声明的函数也被回收了
注意: delete只对对象的属性生效。 所以我们能用它去删除一个用函数语句声明的函数
function fun():void{}
var t:Test = new Test();
t.f = fun;
delete fun; //这个不起作用
delete t.f //这个删除了t的属性f ,但并未删除fun
6、对于函数语句声明的函数,只要在它所在的作用域,不管是在声明代码的前面还是后面都是可以访问的(这个在前面的备忘里说过,as3会把所有的声明提到最前面)。
fun(); //合法
function fun():void{}
fun(); //合法
7、对于函数表达式的函数,只能在它代码之后访问,因为它有一个赋值操作。
fun(); //不合法,由于赋值提前,这时已经知道了fun的存在,但这时并不知道它引用的Function实例。
var fun:Function = function(){};
fun() //合法
8、在as3中的所有参数传递都是引用传递,因为在as3中所有的东西都是对象,但当参数为基元类型时,实现的效果却是值传递。
9、as3实现了默认参数值的功能:
如果在调用具有默认参数值的函数时省略了具有默认值的参数,那么,将使用在函数定义中为该参数指定的值。所有具有默认值的参数都必须放在参数列表的末尾 。指定为默认值的值必须是编译时常量 。如果某个参数存在默认值,则会有效地使该参数成为“可选参数 ”。没有默认值的参数被视为“必需的参数 ”。(必需的参数,调用时必需传值,不然严格模式下会报编译错误)
例如,下面的代码创建一个具有三个参数的函数,其中的两个参数具有默认值。当仅用一个
参数调用该函数时,将使用这些参数的默认值。
function defaultValues(x:int, y:int = 3, z:int = 5):void
{
trace(x, y, z);
}
defaultValues(1); // 1 3 5
10、在as3中也有arguments 对象,功能基本上和javascript中的一样。
■ arguments 对象是一个数组,其中包括传递给函数的所有参数。
■ arguments.length 属性报告传递给函数的参数数量。
■ arguments.callee 属性提供对函数本身的引用,该引用可用于递归调用函数表达式。
■ 避免将 "arguments" 字符串作为参数名,因为它将遮蔽 arguments 对象
11、函数调用中所包括的参数的数量可以大于在函数定义中所指定的参数数量,可以使用 arguments访问所有的参数(使用...Rest参数除外 )。
function traceArgArray(x:int):void
{
for (var i:uint = 0; i < arguments.length; i++)
{
trace(arguments[i]);
}
}
traceArgArray(1, 2, 3);
// 输出:
// 1
// 2
// 3
12、...(rest)参数,赞同于java中的可变参数,必须是声明的最后一个参数。注意的还有,在使用此参数的时候,arguments对象就不可用了,也就是不能使用arguments.callee的功能了 。
function traceArgArray(x: int, ... args)
{
for (var i:uint = 0; i < args.length; i++)
{
trace(args[i]);
}
}
traceArgArray(1, 2, 3);
// 输出:
// 2
// 3
13、as3中的函数是对象。当您创建函数时,就是在创建对象,该对象不仅可以作为参数传递给另一个函数,而且还可以有附加的属性和方法。这个和javascript中是一样的。它还有一个名为 length 的只读属性,它用来存储为该函数定义的参数数量。
本文地址:http://kino.iteye.com/blog/238042 ,转载请注明,谢谢。