1.函数定义
格式:
function 函数名(arg1:type1, arg2:type2...):返回值类型
{
...
}
例:不带返回值
public function showValue(value:String):void
{
Alert.show(value);
}
调用
showValue(“good”); //结果显示good
例:带返回值
public function showValue(value:String):String
{
Alert.show(value);
return "bad";
}
调用
var s:String=showValue(“good”); //显示good
Alert.show(s); //显示bad
2.函数表达式
函数表达式是表达式,而不是语句。这意味着函数表达式不能独立存在,而函数语句则可以。
格式:
var 函数名:funtion = function (arg1:type1, arg2:type2...):返回值类型
{
...
}
例:
var showData:Function = function (value:String):void
{
Alert.show(value);
};
调用
showData(“abc”); //显示abc
例:显示了一个赋予数组元素的函数表达式
var traceArray:Array = new Array();
traceArray[0] = function (aParam:String)
{
trace(aParam);
};
调用
traceArray[0]("hello");
原则上,除非在特殊情况下要求使用表达式,否则应使用函数语句。
函数语句较为简洁,而且与函数表达式相比,更有助于保持严格模式和标准模式的一致性。
3.参数传递
值传递:Boolean、Number、int、uint 和 String
引用传递:不属于以上数据类型的对象
例:值传递
function passPrimitives(xParam:int, yParam:int):void
{
xParam++;
yParam++;
trace(xParam, yParam);
}
var xValue:int = 10;
var yValue:int = 15;
trace(xValue, yValue); // 10 15
passPrimitives(xValue, yValue); // 11 16
trace(xValue, yValue); // 10 15
例:引用传递
function passByRef(objParam:Object):void
{
objParam.x++;
objParam.y++;
trace(objParam.x, objParam.y);
}
var obj:Object = {x:10, y:15};
trace(obj.x, obj.y); // 10 15
passByRef(obj); // 11 16
trace(obj.x, obj.y); // 11 16
将使用在函数定义中为该参数指定的值。所有具有默认值的参数都必须放在参数列表的末尾。指定为默认值的值必须是编译时常量。如果某个参数存在默认值,则会有效地使该参数成为“可选参数” 。没有默认值的参数被视为“必需的参数”。
例如,下面的代码创建一个具有三个参数的函数,其中的两个参数具有默认值。当仅用一个参数调用该函数时,将使用这些参数的默认值。
function defaultValues(x:int, y:int = 3, z:int = 5):void
{
trace(x, y, z);
}
defaultValues(1); // 1 3 5
4.arguments 对象
在将参数传递给某个函数时,可以使用 arguments 对象来访问有关传递给该函数的参数的信息。
arguments 对象的一些重要方面包括:
■ arguments 对象是一个数组,其中包括传递给函数的所有参数。
■ arguments.length 属性报告传递给函数的参数数量。
■ arguments.callee 属性提供对函数本身的引用,该引用可用于递归调用函数表达式。
在 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
注意:
1.如果您在函数声明中使用 ...(rest) 参数,则不能使用 arguments 对象,而必须使用为参数声明的参数名来访问参数。
2.避免将 "arguments" 字符串作为参数名,因为它将遮蔽 arguments 对象。
5....(rest) 参数
ActionScript 3.0 中引入了一个称为 ...(rest) 参数的新参数声明。此参数可用来指定一个数
组参数以接受任意多个以逗号分隔的参数。此参数可以拥有保留字以外的任意名称。此参数
声明必须是最后一个指定的参数。使用此参数会使 arguments 对象变得不可用。尽管 ...(rest)
参数提供了与 arguments 数组和 arguments.length 属性相同的功能,但是它不提供与
arguments.callee 类似的功能。使用 ...(rest) 参数之前,应确保不需要使用
arguments.callee。
下面的示例使用 ...(rest) 参数 (而非 arguments 对象)来重写 traceArgArray() 函数:
function traceArgArray(... args):void
{
for (var i:uint = 0; i < args.length; i++)
{
trace(args[i]);
}
}
traceArgArray(1, 2, 3);
// 输出
// 1
// 2
// 3
...(rest) 参数还可与其它参数一起使用,前提是它是最后一个列出的参数。下面的示例修改
traceArgArray() 函数,以便它的第一个参数 x 是 int 类型,第二个参数使用 ...(rest) 参
数。输出结果将忽略第一个值,因为第一个参数不再属于由 ...(rest) 参数创建的数组。
function traceArgArray(x: int, ... args)
{
for (var i:uint = 0; i < args.length; i++)
{
trace(args[i]);
}
}
traceArgArray(1, 2, 3);
// 输出:
// 2
// 3
6.函数作为对象
ActionScript 3.0 中的函数是对象。当您创建函数时,就是在创建对象,该对象不仅可以作为参数传递给另一个函数,而且还可以有附加的属性和方法。
作为参数传递给另一个函数的函数是按引用(而不是按值)传递的。
例如,下面的代码将名为 clickListener() 的函数作为参数传递给 addEventListener() 方法:
addEventListener(MouseEvent.CLICK, clickListener);
每个函数都有一个名为 length 的只读属性,它用来存储为该函数定义的参数数量。
在 ActionScript 中,发送给函数的参数数量可以超过为该函数定义的参数数量。下面的示例说明了这两个属性之间的区别,此示例仅在标准模式下编译,因为严格模式要求所传递的参数数量与所定义的参数数量完全相同:
function traceLength(x:uint, y:uint):void
{
trace("arguments received: " + arguments.length);
trace("arguments expected: " + traceLength.length);
}
traceLength(3, 5, 7, 11);
/* 输出:
收到的参数数量:4
需要的参数数量:2
*/
7.创建函数属性
函数属性可以用作准静态属性,用来保存与该函数有关的变量的状态。例如,您可能希望跟踪对特定函数的调用次数。
如果您正在编写游戏,并且希望跟踪用户使用特定命令的次数,则这样的功能会非常有用,尽管您也可以使用静态类属性来实现此目的。
下面的代码在函数声明外部创建一个函数属性,在每次调用该函数时都递增此属性:
someFunction.counter = 0;
function someFunction():void
{
someFunction.counter++;
}
someFunction();
someFunction();
trace(someFunction.counter); // 2
参考文献
1.actionscript3.0编程
阅读(3438) | 评论(0) | 转发(0) |