两种定义方法:
函数语句定义:
function add(a:int,b:int):int{
return a+b;
}
函数表达式定义:
var add:Function =function(a:int,b:int):int{
return a + b ;
}
两者区别:
在定义位置上,函数语句定义的函数在编译时会被提升到最前面,而函数表达式定义的只能先定义再使用,只有定义后面的语句才能成功调用。
函数语句定义法和函数表达式定义法还体现再函数中this关键字的记忆上。使用函数语句定义,则this关键字牢牢指向当前函数定义的域;而使用函数表达式定义的,则随着函数附着的对象不同,this关键字也随之改变。
内存管理、垃圾回收上的区别。因为函数表达式不像对象那样独立存在,它相当于一个匿名函数。当持有这个函数引用的数组或对象脱离作用域或由于其他原因不可再用,那么将没有任何方法再访问该匿名函数。此时,这匿名函数对象引用计数为零,符合垃圾回收条件,将被回收。
函数表达式定义的函数是动态的,因此给我们带来极大的便利,而函数语句定义的相反。
传值或传引用
按值传入,那么参数对象会复制一份副本供函数内部操作,参数对象本身不会受影响;按引用传入,则不复制副本,函数内操作参数对象的引用,那么会改变参数对象的状态。在ActionScript 3中,所有的参数都是按引用传入的。只不过,基元数据类型式不变对象,传引用和传值的效果一样。所以,如果参数式基元数据类型,那么可以看成是传值;如果不是基元数据类型,就是传引用。
访问参数信息
在ActionScript 2中可以无视一个函数的定义,传入任意多个参数。但是在ActionScript 3中,要严格遵守函数定义,否则就是非法的。为了提供这种传入任意多参数的灵活性,ActionScript 3提供了一个新的关键字…(rest)。只要在参数中定义了…(rest),那么就可以接受任意多的参数。这些参数,一数组形式保存在rest中。rest只是推荐的命名,可以改成其他名字。
函数的本质
函数一旦执行,一个特殊的对象就建立了。我们称它为“Active Object”,它含有自己的属性和本地变量。函数的本质是这种特殊的Active Object。这个对象我们是不可访问的,属于内建的机制。同时,每个函数都有一个内置的范围链,这是也将被建立,以使Flash Player来检查所有的声明。函数可以层层嵌套,范围链也是如此。最大的范围链当然使全局的范围链了,包括所有的全局变量和函数。
函数表达式定义的函数是动态的,因此给我们带来极大的便利,而函数语句定义的相反。