`
zhanshenlvbu
  • 浏览: 109265 次
社区版块
存档分类
最新评论

ActionScript的arguments 对象和...(rest) 参数

    博客分类:
  • Flex
阅读更多

 

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

 

        如果您在函数声明中使用 ...(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);

// 无输出

        在早期的 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);

// 输出:
// 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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics