在看action script,看到了变量作用域,实际上和javascript是一样的。 查看原文 变量的"作用域"是指可在其中通过引用词汇来访问变量的代码区域。“全局"变量是指在代码的所有区域中定义的变量,而"局部"变量是指仅在代码的某个部分定义的变量。在 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