`

ActionScript3.0学习之路(2)——奇怪的变量作用域

    博客分类:
  • flex
 
阅读更多

转自:http://blog.csdn.net/tassdars/article/details/5728431

今天发现了一个非常奇怪的现象,那就是在ActionScript3.0里面的变量作用域,已经超出了我对于C、Java、C#、 Javascript等语言的所有作用域的认知,一般来说,大家认为的变量作用域的普世原则就是一个大括号,我曾经天真的以为所有的语言都应该是这样,然 后我发现我错了,ActionScript3.0就不是,这个现象是怎么发现的呢?是我在写for循环的时候发现的,如下代码:

[java:nogutter] view plain copy
  1. package  {  
  2.     public   class  Test {  
  3.         public  function method(): void  {  
  4.             for  (var i: int  =  0 ; i <  5 ; i++) {  
  5.             }  
  6.             for  (var i: int  =  0 ; i <  5 ; i++) {  
  7.             }  
  8.         }  
  9.     }  
  10. }  

编译居然不通过,原因是重复定义变量,我当时就纳闷了,变量的作用域不是一个大括号?试了才知道,原来真不是,实践是检验真理的唯一标准。

 

于是就出现了一个比较无语的现象,如下代码:

[java:nogutter] view plain copy
  1. package  {  
  2.     public   class  Test {  
  3.         private  var j: int  =  9 ;  
  4.         public  function method(): void  {  
  5.             var i:int  =  3 ;  
  6.             trace(j);  
  7.             if  (i ==  5 ) {  
  8.                 var j:int  =  1 ;  
  9.             }  
  10.             trace(j);  
  11.         }  
  12.     }  
  13. }  

 

输出多少?(注:我把类的属性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学习指南1

    《Flash Actionscript 3.0学习指南》是针对想要深入理解和掌握ActionScript 3.0这一编程语言的初学者及开发者的重要参考资料。ActionScript 3.0是Adobe Flash平台的核心,用于创建交互式内容、游戏以及富互联网应用...

    ActionScript 3.0 API文档(CHM+HTML最新中文完整)

    《ActionScript 3.0 语言和组件参考》概述 《ActionScript 3.0 语言参考》是 Flash® Player 和 Adobe AIR™ 应用程序编程接口 (API) 的参考手册。 此版本包括支持 Adobe AIR 运行时环境的新 ActionScript 类、...

    ActionScript 3.0开发技术大全(第一部分)

     第2章 搭建ActionScript3.0开发环境  第3章 ActionScript3.0语法 第2篇 ActionScript3.0面向对象特性  第4章 ActionScript3.0面向对象编程  第5章 ActionScript3.0中的String对象  第6章 ActionScript3.0...

    Flash ActionScript3.0教程示例(从入门到精通).rar

    《Flash ActionScript3.0教程示例(从入门到精通)》是一本全面解析ActionScript3.0编程语言在Flash平台上的应用的教程。ActionScript3.0是Adobe Flash Professional中的核心编程语言,用于创建交互式动画、游戏、富...

    ActionScript3.0 Game Programing中文版

    本书首先介绍了ActionScript3.0的基础,包括数据类型、变量、运算符、流程控制等基本概念。接着,读者将学习如何创建类和对象,理解封装、继承和多态等面向对象编程的核心概念。书中还详细讨论了ActionScript3.0的...

    ActionScript3.0殿堂之路.part1.rar

    ActionScript3.0殿堂之路.part1.rar

    Flash ActionScript 3.0 编程技术教程(附书光盘)

    第6~9章介绍了ActionScript 3.0的核心——类及以类为基础的面向对象程序设计方法,包括类的基本概念、ActionScript 3.0中常用类的使用、显示编程和组件类;第10、11章分别介绍了几个ActionScript 3.0实际应用的范例...

    ActionScript3.0从零基础学习类

    由于ActionScript3.0相较于其前代产品ActionScript2.0有了很大的改变,因此从ActionScript2.0转向ActionScript3.0的学习者需要适应新的语法和编程范式。在ActionScript3.0中,更加强调类和对象的使用,鼓励开发者...

    ActionScript3.0宝典 pdf 高清晰

    文件“Wiley.ActionScript.3.0.Bible.Oct.2007.eBook-BBL.pdf”很可能是这本宝典的电子版,它可能涵盖了ActionScript的基础知识,如变量、操作符、控制结构,以及高级主题,如类、包、接口、错误处理和网络编程。...

    Flash Actionscript 3.0学习指南2

    《Flash Actionscript 3.0学习指南2》是针对Adobe Flash平台中ActionScript 3.0编程语言的一份深入学习资料。ActionScript 3.0是Flash开发中的核心语言,相较于早期版本,它有了显著的改进和提升,包括类型系统的...

    ActionScript3.0完全自学手册电子教案_ActionScript3.0_

    1. **基础概念与环境设置**:首先,你需要了解ActionScript3.0的基础,包括变量、数据类型(如Number、String、Boolean)、运算符以及流程控制(如if语句、for循环、while循环)。此外,还需要设置开发环境,如安装...

    ActionScript 3.0 编程.rar

    在ActionScript 3.0中,最大的改变之一是引入了类和强类型系统。这意味着开发者必须预先声明变量的类型,这有助于提高代码的稳定性和可维护性。此外,AS3还引入了命名空间,以解决命名冲突问题,提高了代码组织的...

    Flash ActionScript 3.0学习指南

    ActionScript 3.0是一种嵌入在Flash Player中的编程语言。本书详细而全面的介绍了ActionScript 3.0的基础知识,并结合Flash CS3开发环境讲解如何开发实用的应用系统。全书内容包括ActionScript 3.0 语言介绍、...

    Foundation ActionScript 3.0 Animation

    《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 ActionScript 3.0源代码 Flex 3.0源代码。 --------------------------- 第1篇 Flex技术概述 第1章 Flex概述 3 1.1 Flex简介 3 1.2 Flex...

    Flash ActionScript 3.0编程技术教程(全)

    第6~9章介绍了ActionScript 3.0的核心——类及以类为基础的面向对象程序设计方法,包括类的基本概念、ActionScript 3.0中常用类的使用、显示编程和组件类;第10、11章分别介绍了几个ActionScript 3.0实际应用的范例...

Global site tag (gtag.js) - Google Analytics