分类: 系统运维
2010-08-03 15:34:42
在 ActionScript 3.0 中可通过两种方法来定义函数:使用函数语句和使用函数表达式。
1.
函数语句
函数语句是在严格模式下定义函数的首选方法。函数语句以 function 关键字开头,后跟:
1) 函数名
2) 用小括号括起来的逗号分隔参数列表
3) 用花括号括起来的函数体
例如,下面的代码创建一个定义一个参数的函数,然后将字符串 “hello”用作参数值来调
用该函数:
function
traceParameter(aParam:String)
{
trace(aParam);
}
traceParameter("hello");
// hello
2.
函数表达式
声明函数的第二种方法就是结合使用赋值语句和函数表达式,函数表达式有时也称为函数字面值或匿名函数。这是一种较为繁杂的方法,在早期的 ActionScript 版本中广为使用。
带有函数表达式的赋值语句以 var 关键字开头,后跟:
1) 函数名
2) 冒号运算符 (:)
3)指示数据类型的 Function 类
4) 赋值运算符 (=)
5)function 关键字
6)用小括号括起来的逗号分隔参数列表
7)用大括号括起来的函数体 — 即,在调用函数时要执行的 ActionScript 代码
例如,下面的代码使用函数表达式来声明 traceParameter 函数:
var
traceParameter:Function = function (aParam:String)
{
trace(aParam);
};
traceParameter("hello");
// hello
请注意,就像在函数语句中一样,在上面的代码中也没有指定函数名。
3.两者的区别
函数表达式和函数语句的重要区别是,函数表达式是表达式,而不是语句。这意味着函数表达式不能独立存在,而函数语句则可以。函数表达式只能用作语句 (通常是赋值语句)的一部分。下面的
示例显示了一个赋予数组元素的函数表达式:
var
traceArray:Array = new Array();
traceArray[0] = function
(aParam:String)
{
trace(aParam);
};
traceArray[0]("hello");//hello
原则上,除非在特殊情况下要求使用表达式,否则应使用函数语句。函数语句较为简洁,而
且与函数表达式相比,更有助于保持严格模式和标准模式的一致性。
函数语句比包含函数表达式的赋值语句更便于阅读。
在 ActionScript 3.0 中,所有的参数均按引用传递,因为所有的值都存储为对象。但是,属于基元数据类型(包括 Boolean、Number、int、uint 和 String)的对象具有一些特殊运算
符,这使它们可以像按值传递一样工作。
1.默认参数值
在函数定义时,可以指定函数中的默认值。被指定的默认值的参数应放到函数参数列表的末尾。在调用函数时,被指定默认值的函数参数可以不写。
例如:
function
defaultValues(x:int, y:int = 3, z:int = 5):void
{
trace(x, y,
z);
}
defaultValues(1); // 1 3 5
2....(rest)
参数
在定义函数时可以使用....(rest)为函数定义任意多个参数,....(rest)将为函数创建一个参数数组,在....(rest)前的参数被传入后,其余的参数将依次被放入....(rest)创建的参数数组中。
示例:
function
s(owner:String,...pets)
{
trace("owner="+owner);
for(var
i:Object in pets)
{
trace("pet_"+i+"="+pets[i]);
}
}
s("Lee","Dog","Cat","Duck");
结果:
owner=Lee
pet_0=Dog
pet_1=Cat
pet_2=Duck
3.arguments
对象
在将参数传递给某个函数时,可以使用 arguments 对象来访问有关传递给该函数的参数的
信息。 arguments 对象的一些重要方面包括:
1) arguments 对象是一个数组,其中包括传递给函数的所有参数。
2) arguments.length 属性报告传递给函数的参数数量。
3) arguments.callee 属性提供对函数本身的引用,该引用可用于递归调用函数表达式。
注意
如果将任何参数命名为 arguments,或者使用 ...(rest) 参数,则 arguments 对象不可用。
在 ActionScript 3.0 中,函数调用中所包括的参数的数量可以大于在函数定义中所指定的参数数量,但是,如果参数的数量小于必需参数的数量,在严格模式下将生成编译器错误。
可以使用 arguments 对象的数组样式来访问传递给函数的任何参数,而无需考虑是否在函
数定义中定义了该参数。下面的示例使用 arguments 数组及 arguments.length 属性来输出
传递给 traceArgArray() 函数的所有参数:
function
traceArgArray(x:int):void
{
for
(var i:uint = 0; i < arguments.length; i++)
{
trace(arguments[i]);
}
}
traceArgArray(1,
2, 3);
// 输出:
// 1
// 2
// 3
arguments.callee
属性通常用在匿名函数中以创建递归。您可以使用它来提高代码的灵活
性。如 果 递 归 函 数 的 名 称 在 开 发 周 期 内 的 不 同 阶 段 会 发 生 改 变,而 且 您 使 用 的 是arguments.callee(而非函数名),则不必花费精力在函数体内更改递归调用。在下面的函数表达式中,使用 arguments.callee 属性来启用递归:
var factorial:Function =
function (x:uint)
{
if(x == 0)
{
return 1;
}
else
{
return (x *
arguments.callee(x - 1));
}
}
trace(factorial(5)); //
120
如果您在函数声明中使用 ...(rest) 参数,则不能使用 arguments 对象,而必须使用为参数声明的参数名来访问参数。
还应避免将 "arguments" 字符串作为参数名,因为它将遮蔽 arguments 对象。例如,如果重写 traceArgArray() 函数,以便添加 arguments 参数,那么,函数体内对 arguments 的
引用所引用的将是该参数,而不是 arguments 对象。下面的代码不生成输出结果:
function
traceArgArray(x:int, arguments:int):void
{
for (var i:uint = 0; i < arguments.length; i++)
{
trace(arguments[i]);
}
}
traceArgArray(1, 2, 3);
// 无输出
在函数中使用return语句返回函数的值,当函数执行遇到return语句时,程序直接跳出函数,return语句之后的代码不被执行