ActionScript 3.0 变量

 

变量可用来存储程序中使用的值。要声明变量,必须将 var 语句和变量名结合使用。在 ActionScript 2.0 中,只有当您使用类型注释时,才需要使用 var 语句。在 ActionScript 3.0 中,总是需要使用 var 语句。例如,下面的 ActionScript 行声明一个名为 i 的变量:

var i;

如果在声明变量时省略了 var 语句,在严格模式下将出现编译器错误,在标准模式下将出现运行时错误。例如,如果以前未定义变量 i,则下面的代码行将产生错误:

i; // 如果以前未定义 I,将出错

要将变量与一个数据类型相关联,则必须在声明变量时进行此操作。在声明变量时不指定变量的类型是合法的,但这在严格模式下将产生编译器警告。可通过在变量名后面追加一个后跟变量类型的冒号 (:) 来指定变量类型。例如,下面的代码声明一个 int 类型的变量 i

var i:int;

可以使用赋值运算符 (=) 为变量赋值。例如,下面的代码声明一个变量 i 并将值 20 赋给它:

var i:int;
i = 20;

您可能会发现在声明变量的同时为变量赋值可能更加方便,如下面的示例所示:

var i:int = 20;

通常,在声明变量的同时为变量赋值的方法不仅在赋予基元值(如整数和字符串)时很常用,而且在创建数组或实例化类的实例时也很常用。下面的示例显示了一个使用一行代码声明和赋值的数组。

var numArray:Array = ["zero", "one", "two"];

可以使用 new 运算符来创建类的实例。下面的示例创建一个名为 CustomClass 的实例,并向名为 customItem 的变量赋予对该实例的引用:

var customItem:CustomClass = new CustomClass();

如果要声明多个变量,则可以使用逗号运算符 (,) 来分隔变量,从而在一行代码中声明所有这些变量。例如,下面的代码在一行代码中声明 3 个变量:

var a:int, b:int, c:int;

也可以在同一行代码中为其中的每个变量赋值。例如,下面的代码声明 3 个变量(abc)并为每个变量赋值:

var a:int = 10, b:int = 20, c:int = 30;

尽管您可以使用逗号运算符来将各个变量的声明组合到一条语句中,但是这样可能会降低代码的可读性。

子主题

了解变量的作用域

默认值

了解变量的作用域

变量的"作用域"是指可在其中通过引用词汇来访问变量的代码区域。"全局"变量是指在代码的所有区域中定义的变量,而"局部"变量是指仅在代码的某个部分定义的变量。在 ActionScript 3.0 中,始终为变量分配声明它们的函数或类的作用域。全局变量是在任何函数或类定义的外部定义的变量。例如,下面的代码通过在任何函数的外部声明一个名为 strGlobal 的全局变量来创建该变量。从该示例可看出,全局变量在函数定义的内部和外部均可用。

var strGlobal:String = "Global";
function scopeTest()
{
    trace(strGlobal); // 全局
}
scopeTest();
trace(strGlobal); // 全局

可以通过在函数定义内部声明变量来将它声明为局部变量。可定义局部变量的最小代码区域就是函数定义。在函数内部声明的局部变量仅存在于该函数中。例如,如果在名为 localScope() 的函数中声明一个名为 str2 的变量,该变量在该函数外部将不可用。

function localScope()
{
    var strLocal:String = "local";
}
localScope();
trace(strLocal); // 出错,因为未在全局定义 strLocal

如果用于局部变量的变量名已经被声明为全局变量,那么,当局部变量在作用域内时,局部定义会隐藏(或遮蔽)全局定义。全局变量在该函数外部仍然存在。例如,下面的代码创建一个名为 str1 的全局字符串变量,然后在 scopeTest() 函数内部创建一个同名的局部变量。该函数中的 trace 语句输出该变量的局部值,而函数外部的 trace 语句则输出该变量的全局值。

var str1:String = "Global";
function scopeTest ()
{
    var str1:String = "Local";
    trace(str1); // 本地
}
scopeTest();
trace(str1); // 全局

与 C++ 和 Java 中的变量不同的是,ActionScript 变量没有块级作用域。代码块是指左大括号 ({) 与右大括号 (}) 之间的任意一组语句。在某些编程语言(如 C++ 和 Java)中,在代码块内部声明的变量在代码块外部不可用。对于作用域的这一限制称为块级作用域,ActionScript 中不存在这样的限制,如果您在某个代码块中声明一个变量,那么,该变量不仅在该代码块中可用,而且还在该代码块所属函数的其它任何部分都可用。例如,下面的函数包含在不同的块作用域中定义的变量。所有的变量均在整个函数中可用。

function blockTest (testArray:Array)
{
    var numElements:int = testArray.length;
    if (numElements > 0)
    {
        var elemStr:String = "Element #";
        for (var i:int = 0; i < numElements; i++)
        {
            var valueStr:String = i + ": " + testArray[i];
            trace(elemStr + valueStr);
        }
        trace(elemStr, valueStr, i);   // 仍定义了所有变量
    }
    trace(elemStr, valueStr, i); // 如果 numElements > 0,则会定义所有变量
}

blockTest(["Earth", "Moon", "Sun"]);

有趣的是,如果缺乏块级作用域,那么,只要在函数结束之前对变量进行声明,就可以在声明变量之前读写它。这是由于存在一种名为"提升"的方法,该方法表示编译器会将所有的变量声明移到函数的顶部。例如,下面的代码会进行编译,即使 num 变量的初始 trace() 函数发生在声明 num 变量之前也是如此。

trace(num); // NaN
var num:Number = 10;
trace(num); // 10

但是,编译器将不会提升任何赋值语句。这就说明了为什么 num 的初始 trace() 会生成 NaN(而非某个数字),NaN 是 Number 数据类型变量的默认值。这意味着您甚至可以在声明变量之前为变量赋值,如下面的示例所示:

num = 5;
trace(num); // 5
var num:Number = 10;
trace(num); // 10

默认值

"默认值"是在设置变量值之前变量中包含的值。首次设置变量的值实际上就是"初始化"变量。如果您声明了一个变量,但是没有设置它的值,则该变量便处于"未初始化"状态。未初始化的变量的值取决于它的数据类型。下表说明了变量的默认值,并按数据类型对这些值进行组织:

数据类型

默认值

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

未声明(与类型注释 * 等效)

undefined

其它所有类(包括用户定义的类)。

null

对于 Number 类型的变量,默认值是 NaN(而非某个数字),NaN 是一个由 IEEE-754 标准定义的特殊值,它表示非数字的某个值。

如果您声明某个变量,但是未声明它的数据类型,则将应用默认数据类型 *,这实际上表示该变量是无类型变量。如果您没有用值初始化无类型变量,则该变量的默认值是 undefined

对于 Boolean、Number、int 和 uint 以外的数据类型,所有未初始化变量的默认值都是 null。这适用于由 Flash Player API 定义的所有类以及您创建的所有自定义类。

对于 Boolean、Number、int 或 uint 类型的变量,null 不是有效值。如果您尝试将值 null 赋予这样的变量,则该值会转换为该数据类型的默认值。对于 Object 类型的变量,可以赋予 null 值。如果您尝试将值 undefined 赋予 Object 类型的变量,则该值会转换为 null

对于 Number 类型的变量,有一个名为 isNaN() 的特殊的顶级函数。如果变量不是数字,该函数将返回布尔值 true,否则将返回 false

你可能感兴趣的:(摘抄)