变量的
作用域
是指可在其中通过词汇引用来访问变量的代码区域。
全局
变量是指在代码的所有区域中定义的变量,而
局部
变量是指仅在代码的某个部分定义的变量。在 ActionScript 3.0 中,始终为变量分配声明它们的函数或类的作用域。全局变量是在任何函数或类定义的外部定义的变量。例如,下面的代码通过在任何函数的外部声明一个名为
strGlobal
的全局变量来创建该变量。从该示例可看出,全局变量在函数定义的内部和外部均可用。
var strGlobal:String = "Global";
function scopeTest()
{
trace(strGlobal); // Global
}
scopeTest();
trace(strGlobal); // Global
可以通过在函数定义内部声明变量来将它声明为局部变量。可定义局部变量的最小代码区域就是函数定义。在函数内部声明的局部变量仅存在于该函数中。例如,如果在名为
localScope()
的函数中声明一个名为
str2
的变量,该变量在该函数外部是不可用的。
function localScope()
{
var strLocal:String = "local";
}
localScope();
trace(strLocal); // error because strLocal is not defined globally
如果用于局部变量的变量名已经被声明为全局变量,那么,当局部变量在作用域内时,局部定义会隐藏(或遮蔽)全局定义。全局变量在该函数外部仍然存在。例如,下面的代码创建一个名为
str1
的全局字符串变量,然后在
scopeTest()
函数内部创建一个同名的局部变量。该函数中的
trace
语句输出该变量的局部值,而函数外部的
trace
语句则输出该变量的全局值。
var str1:String = "Global";
function scopeTest ()
{
var str1:String = "Local";
trace(str1); // Local
}
scopeTest();
trace(str1); // Global
与 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); // all still defined
}
trace(elemStr, valueStr, i); // all defined if 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