AS3学习笔记(2)
函数的定义方式:函数语句声明法和函数表达式声明法。
1.函数语句定义法
function texts(num1:int,num2:int):int
{
return num1+num2;
}
2.函数表达式定义法
var textAdd:Function=function(num1:int,num2:int)
{
return num1+num2;
}
*等号右面的内容function并没有函数名,相当于创建一个匿名函数对象,并将引用赋值给左边的函数类型变量。
两种定义法的区别:
1.函数表达式定义法 必须先定义,才能使用。
下文有更详细的说明。
下面的例子这样定义,texta()将不能使用。
texta();
textb();
var texta:Function=function():void{trace(“a”)};
function textb():void{trace(“b”)}
参数:
1.按值传入:那么对数对象会赋值一份副本供函数内部操作,参数对象本身不会受到影响。
2.按引用传入:则不复制副本,函数内部操作参数对象的引用,会改变参数对象的状态。
下面看一个例子:
function test(number:int,arr:Array)
{
number=100;
arr.push(100);
}
var number:int=10;
var arr:Array=[1,2,3];
test(number,arr);
trace(number);
trace(arr);输出结果为:
10
1,2,3,100
3.设置默认参数
function test(a:int=1,b:int=2){
trace(a+b,a,b);
}
test();
test(10);
test(10,29);
输出结果为:
3 1 2 //没有设置参数时,使用两个默认参数
12 10 2 //设置第一个参数时,第二个采用默认参数值
39 10 29 //设置两个参数,不适用默认参数值
访问参数信息:
在函数中传入的参数都被保留在了函数自动生成的一个arguments对象中。arguments如同一个数组,按参数定义的顺序保留着传入的参数。可以使用索引访问,
arguments[0],arguments[1]访问传入的参数。
下面看一个例子:
function test(a:int=1,b:int=2):void{
trace("参数长度:"+arguments.length);
trace(a+b,a,b);
if(a+b>0)
{
arguments.callee(a-1,b-1); //递归
}
}
test();
输出结果:
参数长度:0 //第一次调用test(),没有参数传入。
3 1 2
参数长度:2 //经过 arguments.callee(a-1,b-1); 填满了2个参数 a=0,b=11 0 1
参数长度:2
-1 -1 0
…(rest)关键字:
在参数定义时,使用…(rest)关键字,就可以传入任意参数了。(rest)只是个推荐名,可以使用其他的.
下面看一个例子:
function test(...paras):void
{
trace("参数长度为:"+paras.length);
for(var i in paras)
{
trace(paras[i]);
}
}
test(2,[3,4,5,5],"asdasd");
输出结果为:
参数长度为:3
2
3,4,5,5
asdasd
函数的本质:
函数本身是一个Function类型的对象,可以独立的属性甚至方法。
函数一旦执行,一个特殊的对象就建立了,称之为“Active Object”,函数的本质就是这种特殊的"Active Object”,这个对象我们是不能访问的。
同时,每个函数都有一个内置的范围链,这是也被建立,以使Flash播放器来检查所有的声明。
下面看一下两种函数定义方法定义的函数对象的根本区别。
1.函数语句定义法:
import flash.utils.getQualifiedClassName
trace(getQualifiedClassName(func));
trace(getQualifiedSuperclassName(func));
trace(func is Function);
trace(func is Object);
输出结果:
builtin.as$0::MethodClosure //说明func的类型是一个内置的MethodClosure对象
Function //说明MethodClosure类的父类是Function
true //确认func是Function类型的对象
true //func是Object类型的对象,因为Function类是Object的子类
2.函数表达式定义法:
import flash.utils.getQualifiedClassName
var func:Function=function(){}
trace(getQualifiedClassName(func));
trace(func is Function);
trace(func is Object);
输出结果:
Function-1 //是一个Function-1 类型。这个Function-1 类型是再编译时生成的Function的子类。
truetrue
函数的高级使用技巧:
1.代理函数对象
var mainFunc:Function;
var sex:String="male";
if(sex=="male")
{
mainFunc=male;
}
else
{mainFunc=female;
}
mainFunc();
function male()
{
trace("男");
}
function female()
{
trace("女");
}