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=1

1 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的子类。
true

true

 

函数的高级使用技巧:

1.代理函数对象

                var mainFunc:Function;
                var sex:String="male";
                if(sex=="male")
                {
                    mainFunc=male;
                    }
                    else
                    {mainFunc=female;
                        }
                mainFunc();
               
                function male()
                {
                    trace("男");
                    }
                   
               
                function female()
                {
                    trace("女");
                    }

 


 

 

 

 

 


posted @ 2011-09-28 13:36  高捍得  阅读(290)  评论(0编辑  收藏  举报