Thursday, January 10, 2008

ActionScript 变量作用域说明

与 C++ 和 Java 中的变量不同的是,ActionScript 变量没有块级作用域。代码块是指左大括号 ({) 与右大括号 (}) 之间的任意一组语句。在某些编程语言(如 C++ 和 Java)中,在代码块内部声明的变量在代码块外部不可用。对于作用域的这一限制称为块级作用域,ActionScript 中不存在这样的限制,如果您在某个代码块中声明一个变量,那么,该变量不仅在该代码块中可用,而且还在该代码块所属函数的其它任何部分都可用。例如,下面的函数包含在不同的块作用域中定义的变量。所有的变量均在整个函数中可用。
有趣的是,如果缺乏块级作用域,那么,只要在函数结束之前对变量进行声明,就可以在声
明变量之前读写它。这是由于存在一种名为“提升”的方法,该方法表示编译器会将所有的
变量声明移到函数的顶部。例如,下面的代码会进行编译,即使 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


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"]);

No comments :