转自:http://blog.csdn.net/tassdars/article/details/5728431
今天发现了一个非常奇怪的现象,那就是在ActionScript3.0里面的变量作用域,已经超出了我对于C、Java、C#、
Javascript等语言的所有作用域的认知,一般来说,大家认为的变量作用域的普世原则就是一个大括号,我曾经天真的以为所有的语言都应该是这样,然
后我发现我错了,ActionScript3.0就不是,这个现象是怎么发现的呢?是我在写for循环的时候发现的,如下代码:
-
package
{
-
public
class
Test {
-
public
function method():
void
{
-
for
(var i:
int
=
0
; i <
5
; i++) {
-
}
-
for
(var i:
int
=
0
; i <
5
; i++) {
-
}
-
}
-
}
-
}
编译居然不通过,原因是重复定义变量,我当时就纳闷了,变量的作用域不是一个大括号?试了才知道,原来真不是,实践是检验真理的唯一标准。
于是就出现了一个比较无语的现象,如下代码:
-
package
{
-
public
class
Test {
-
private
var j:
int
=
9
;
-
public
function method():
void
{
-
var i:int
=
3
;
-
trace(j);
-
if
(i ==
5
) {
-
var j:int
=
1
;
-
}
-
trace(j);
-
}
-
}
-
}
输出多少?(注:我把类的属性j去掉也是能通得过编译的,第一个trace居然能在j被声明之前访问j)按照逻辑分析,前面那个j应该是属性j应该
是输出9是吧,i等于5不可能成立,于是if代码块不可能会执行,后面那个j也应该是输出9吧,那就大错特错,后面那个j输出结果居然是0,为何?
我曾经怀疑过是不是ActionScript3.0也像Javascript一样,变量不用声明就可以直接使用,结果我删掉属性j,去掉局部变量j的声明,改为直接访问,无法通过编译,这说明ActionScript3.0是不支持使用未声明的变量的。
按照我的分析,只能这么解释,ActionScript3.0在初始化一个类的时候,把所有的属性和局部变量声明语句都先初始化为默认值,然后把所
有的变量划分为是属于类的属性还是某个方法的局部变量,下次遇到局部变量声明语句时,将声明语句变为赋值语句,若在方法内遇到可能是属性也可能是局部变量
的变量访问时,看其到底是在同名局部变量之前还是之后,之前就访问属性的值,之后就访问局部变量的值。
这样一来,以下的种种都能说得通了。
首先,上面第一个j是9,第二个j是0。因为i等于5不成立,已经被变为赋值语句的j的声明语句并未执行,于是j没有被赋值为1。
然后我们改if中的判断条件,让它成立,第二个j输出结果果然变成了1,声明语句已经被当作赋值语句用了。
接下来我们去掉属性j,运行并未报编译错误,说明类初始化的时候,局部变量的声明就已经执行了。这时输出结果为第一个j是0,第二个j也是0,因为if代码块未执行。
然后我们把if条件改为成立,这时输出结果为第一个j是0,第二个j是1,显然这里声明语句完全被当作赋值语句使用了。
综上所述,ActionScript3.0里面的作用域分为属性和方法(未尝试过类外面是否可以定义全部变量或者包变量之类的,也没有试过闭包,这
些以后有空再试试),属性暂且不表,局部变量的声明语句在类初始化的时候就会调用,之后它的作用就变成了两个,一是变为赋值语句,按正常的流程控制执行,
二是若有同名属性,区别变量的访问是在声明语句之前还是之后,之前使用属性,之后使用局部变量。
非常奇怪ActionScript3.0这样的设计到底是出于一个什么样的考虑,虽然一般人不会这样用,但编译器未做语法限制,一旦这样使用,会使得逻辑变得相当混乱,难以理清,清晰度远不如基于大括号的变量作用域,个人认为应该算是一个不良设计。
以上测试是在Flash Builder 4 PlugIn for Eclipse和Flash CS 4之中进行的(变量重复定义在Flash
CS 4中是通不过编译的,除非改成“非严谨模式”,而Flash Builder 4则只是警告,不影响编译,可能Flash Builder
4默认是采用非严谨模式吧),是否编译器问题不得而知,不过这可是官方发布的工具,应该不至于吧,若以上分析有逻辑错误,也欢迎大家指正。
最近偶然看到一些ActionScript3.0关于反射方面的知识,发现有牛人的解答让我有些豁然开朗的感觉。
ActionScript3.0是一种编译型语言,而并非解释型,最终是要编译成swf文件,编译型语言的特点是生成的文件直接可以运行,不需要依赖太多
的库,用一些基本库就行了,但是用户自己写的类是不包含在基本库里面的,于是,编译器就需要把代码里面用到的所有类的信息全部包含进swf文件里面,所以
就有了编译一开始就检查所有的声明语句并执行了,这样可以只把用到的类编译进swf文件,使它的体积更小,便于网络传输。
然后今天看了一下官方的文档,发现由于ActionScript3.0不存在块级作用域,编译器会将函数内所有局部变量
的
声明
提升到函数顶部,但是赋值语句却不会提升,所以才造成了以上的有趣现象,局部变量在未声明之前就可以使用。
分享到:
相关推荐
《Flash Actionscript 3.0学习指南》是针对想要深入理解和掌握ActionScript 3.0这一编程语言的初学者及开发者的重要参考资料。ActionScript 3.0是Adobe Flash平台的核心,用于创建交互式内容、游戏以及富互联网应用...
《ActionScript 3.0 语言和组件参考》概述 《ActionScript 3.0 语言参考》是 Flash® Player 和 Adobe AIR™ 应用程序编程接口 (API) 的参考手册。 此版本包括支持 Adobe AIR 运行时环境的新 ActionScript 类、...
第2章 搭建ActionScript3.0开发环境 第3章 ActionScript3.0语法 第2篇 ActionScript3.0面向对象特性 第4章 ActionScript3.0面向对象编程 第5章 ActionScript3.0中的String对象 第6章 ActionScript3.0...
《Flash ActionScript3.0教程示例(从入门到精通)》是一本全面解析ActionScript3.0编程语言在Flash平台上的应用的教程。ActionScript3.0是Adobe Flash Professional中的核心编程语言,用于创建交互式动画、游戏、富...
本书首先介绍了ActionScript3.0的基础,包括数据类型、变量、运算符、流程控制等基本概念。接着,读者将学习如何创建类和对象,理解封装、继承和多态等面向对象编程的核心概念。书中还详细讨论了ActionScript3.0的...
ActionScript3.0殿堂之路.part1.rar
第6~9章介绍了ActionScript 3.0的核心——类及以类为基础的面向对象程序设计方法,包括类的基本概念、ActionScript 3.0中常用类的使用、显示编程和组件类;第10、11章分别介绍了几个ActionScript 3.0实际应用的范例...
由于ActionScript3.0相较于其前代产品ActionScript2.0有了很大的改变,因此从ActionScript2.0转向ActionScript3.0的学习者需要适应新的语法和编程范式。在ActionScript3.0中,更加强调类和对象的使用,鼓励开发者...
文件“Wiley.ActionScript.3.0.Bible.Oct.2007.eBook-BBL.pdf”很可能是这本宝典的电子版,它可能涵盖了ActionScript的基础知识,如变量、操作符、控制结构,以及高级主题,如类、包、接口、错误处理和网络编程。...
《Flash Actionscript 3.0学习指南2》是针对Adobe Flash平台中ActionScript 3.0编程语言的一份深入学习资料。ActionScript 3.0是Flash开发中的核心语言,相较于早期版本,它有了显著的改进和提升,包括类型系统的...
1. **基础概念与环境设置**:首先,你需要了解ActionScript3.0的基础,包括变量、数据类型(如Number、String、Boolean)、运算符以及流程控制(如if语句、for循环、while循环)。此外,还需要设置开发环境,如安装...
在ActionScript 3.0中,最大的改变之一是引入了类和强类型系统。这意味着开发者必须预先声明变量的类型,这有助于提高代码的稳定性和可维护性。此外,AS3还引入了命名空间,以解决命名冲突问题,提高了代码组织的...
ActionScript 3.0是一种嵌入在Flash Player中的编程语言。本书详细而全面的介绍了ActionScript 3.0的基础知识,并结合Flash CS3开发环境讲解如何开发实用的应用系统。全书内容包括ActionScript 3.0 语言介绍、...
《Foundation ActionScript 3.0 Animation》是一本深入探讨ActionScript 3.0动画技术的专业书籍,主要聚焦在“Making Things Move”的主题上。ActionScript是Adobe Flash平台的核心编程语言,而ActionScript 3.0作为...
《精通Flex 3.0——基于ActionScript 3.0实现》一书源代码。 Flex 3.0 ActionScript 3.0源代码 Flex 3.0源代码。 --------------------------- 第1篇 Flex技术概述 第1章 Flex概述 3 1.1 Flex简介 3 1.2 Flex...
第6~9章介绍了ActionScript 3.0的核心——类及以类为基础的面向对象程序设计方法,包括类的基本概念、ActionScript 3.0中常用类的使用、显示编程和组件类;第10、11章分别介绍了几个ActionScript 3.0实际应用的范例...