在 ActionScript 3.0 中,所有的参数均按引用传递,因为所有的值都存储为对象。但是,属于基元数据类型(包括 Boolean、Number、int、uint 和 String)的对象具有一些特殊运算符,这使它们可以像按值传递一样工作。例如,下面的代码创建一个名为 passPrimitives() 的函数,该函数定义了两个类型均为 int、名称分别为 xParam 和 yParam 的参数。这些参数与在 passPrimitives() 函数体内声明的局部变量类似。
当使用 xValue 和 yValue 参数调用函数时,xParam 和 yParam 参数将用对 int 对象的引用进行初始化,int 对象由 xValue 和 yValue 表示。因为参数是基元值,所以它们像按值传递一样工作。尽管 xParam 和 yParam 最初仅包含对 xValue 和 yValue 对象的引用,但是,对函数体内的变量的任何更改都会导致在内存中生成这些值的新副本。
- 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
在 passPrimitives() 函数内部,xParam 和 yParam 的值递增,但这不会影响 xValue 和 yValue 的值,如上一条 trace 语句所示。即使参数的命名与 xValue 和 yValue 变量的命名完全相同也是如此,因为函数内部的 xValue 和 yValue 将指向内存中的新位置,这些位置不同于函数外部同名的变量所在的位置。
其它所有对象(即不属于基元数据类型的对象)始终按引用传递,这样您就可以更改初始变量的值。例如,下面的代码创建一个名为 objVar 的对象,该对象具有两个属性:x 和 y。该对象作为参数传递给 passByRef() 函数。因为该对象不是基元类型,所以它不但按引用传递,而且还保持一个引用。这意味着对函数内部的参数的更改将会影响到函数外部的对象属性。
- function passByRef(objParam:Object):void
- {
- objParam.x++;
- objParam.y++;
- trace(objParam.x, objParam.y);
- }
- var objVar:Object = {x:10, y:15};
- trace(objVar.x, objVar.y); // 10 15
- passByRef(objVar); // 11 16
- trace(objVar.x, objVar.y); // 11 16
objParam 参数与全局 objVar 变量引用相同的对象。正如在本示例的 trace 语句中所看到的一样,对 objParam 对象的 x 和 y 属性所做的更改将反映在 objVar 对象中。
... (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);
- // output:
- // 1
- // 2
- // 3
... (rest) 参数还可与其它参数一起使用,前提是 ... (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);
- // output:
- // 2
- // 3