As3.0 arguments ...rest

引用:http://help.adobe.com/zh_CN/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html  官方文档

函数参数

ActionScript 3.0 为函数参数提供了一些功能,这些功能对于那些刚接触 ActionScript 语言的程序员来说可能是很陌生的。尽管大多数程序员都应熟悉按值或按引用传递参数这一概念,但是很多人可能对 arguments 对象和 ... (rest) 参数感到很陌生。

按值或按引用传递参数

在许多编程语言中,一定要了解按值传递参数与按引用传递参数之间的区别;这种区别会影响代码的设计方式。

按值传递意味着将参数的值复制到局部变量中以便在函数内使用。按引用传递意味着将只传递对参数的引用,而不传递实际值。这种方式的传递不会创建实际参数的任何副本,而是会创建一个对变量的引用并将它作为参数传递,并且会将它赋给局部变量以便在函数内部使用。局部变量是对函数外部的变量的引用,它使您能够更改初始变量的值。

在 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 对象中。

默认参数值

ActionScript 3.0 中新增了为函数声明默认参数值 的功能。如果在调用具有默认参数值的函数时省略了具有默认值的参数,那么,将使用在函数定义中为该参数指定的值。所有具有默认值的参数都必须放在参数列表的末尾。指定为默认值的值必须是编译时常量。如果某个参数存在默认值,其效果会使该参数成为可选参数。没有默认值的参数被视为必需参数

例如,下面的代码创建一个具有三个参数的函数,其中的两个参数具有默认值。当仅用一个参数调用该函数时,将使用这些参数的默认值。

function defaultValues(x:int, y:int = 3, z:int = 5):void 
{ 
    trace(x, y, z); 
} 
defaultValues(1); // 1 3 5
arguments 对象

在将参数传递给某个函数时,可以使用 arguments 对象来访问有关传递给该函数的参数的信息。arguments 对象的一些重要方面包括:

  • arguments 对象是一个数组,其中包括传递给函数的所有参数。

  • arguments.length 属性报告传递给函数的参数数量。

  • arguments.callee 属性提供对函数本身的引用,该引用可用于递归调用函数表达式。

    注: 如果将任何参数命名为  arguments,或者使用 ...(rest) 参数,则  arguments 对象不可用。

    如果在函数体中引用了 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); 
     
    // output: 
    // 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); 
     
    // no output

    在早期的 ActionScript 版本中,arguments 对象还包含一个名为 caller 的属性,该属性是对当前函数的引用。ActionScript 3.0 中没有 caller 属性,但是,如果您需要引用调用函数,则可以更改调用函数,以使其传递一个额外的参数来引用其本身。

... (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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值