注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

ActionScript3语言陷阱和缺陷  

2009-08-14 11:31:53|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  1. 闭包会产生多余的引用

  2. ActionScirpt3的闭包会引用外层函数的所有局部变量,而不仅仅只是用到的变量。这些多余的引用是不必要的。它们会使垃圾收集器认为这些数据仍然被引用着而不去释放,哪怕这些数据本来已经不可能再被用到。例如,以下代码会导致内存泄露:
    package {
    import flash.display.*
    public final class C extends Sprite {
    private static function ref(f:Function):Function {
    return function():void {
    }
    }
    private var f:Function = function():void{}
    public function C() {
    for(var i:uint = 0; i < 1000000; i++) {
    f = ref(f)
    }
    }
    }
    }
  3. 与JavaScript的异同

  4. ActionScript2和JavaScript一致的地方更多些,而ActionScript3则少一些,这样会迷惑很多用惯JavaScript的人,例如:
    http://www.ac.net.blog.163.com/blog/static/1364905620060274329791/
    http://www.ac.net.blog.163.com/blog/static/1364905620060297425813/
    还有一些区别在ASDoc中也提到了,比如=== 和 == 用在Number、uint、String上时,AS2和AS3行为是不同的。
  5. 编译器不检查函数返回值类型

  6. 例如,以下代码可以通过编译。
    function xxx():uint {
    return 0
    }
    var a:Array = xxx()
  7. 局部变量的范围是整个函数而不是某个区块

  8. 例如以下代码会出错:
    function f(b:Boolean):void {
    if(b) {
    var a:String = "a"
    } else {
    var a:Array = []
    }
    }
    这一点对于闭包的使用来说,很麻烦,例如
    var a:Array = []
    for(var i:uint = 0; i < 10; i++) {
    a[i] = function():uint {
    return i
    }
    }
    trace(a[3]()) // 输出10而不是3
    上述代码会trace出 10 而不是 3
  9. const并不真的不可改变

  10. 更有甚者,即使你使用 const 关键字声明一个常量,实际上它还是会被改变:
    var a:Array = []
    for(var i:uint = 0; i < 10; i++) {
      const c:uint = i
    a[i] = function():uint {
    return c
    }
    }
    trace(a[3]()) // 还是输出10而不是3
  11. setTimeout不自动释放对闭包的引用

  12. ASDoc中的的文档有下面这句话:
    If you intend to use the clearTimeout() method to cancel the setTimeout() call, be sure to assign the setTimeout() call to a variable (which the clearTimeout() function will later reference). If you do not call the clearTimeout() function to cancel the setTimeout() call, the object containing the set timeout closure function will not be garbage collected.
    意思是说,如果是说可以用clearTimeout来取消setTimeout设置的定时器。让人觉得言下之意是,如果不想取消定时器,不调用clearTimeout也可以。实际上,如果不调用clearTimeout,就会导致内存泄露。setTimeout并不自动释放对闭包的引用。
  评论这张
 
阅读(961)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018