将嵌套函数与事件侦听器一起使用有什么问题吗?

时间:2014-11-18 21:16:07

标签: actionscript-3 flex flex4

我刚刚在AS3中发现了嵌套函数(是的,迟到了)并且正在Flex项目中使用它们。我一直不喜欢使用单独的函数进行基本模态操作和eventListeners-为代码添加杂乱并分离操作逻辑,以及无法轻松引用局部变量。

以下示例用于选择目录的用户似乎工作得很好并且很紧凑但是我想知道是否有任何问题我不知道这种方法。此外,使用非模态操作(例如,使用Loader之类的异步),是否可以使用嵌套函数?

        private var rootDirectory:File;

        protected function rootBtn_clickHandler(event:MouseEvent):void
        {
            var tmp:File = File.desktopDirectory;
            tmp.browseForDirectory("Set Project Folder");
            tmp.addEventListener(Event.SELECT, onUserSelect);
            tmp.addEventListener(Event.CANCEL, onUserCancel);

            function onUserSelect(event:Event):void
            {
                tmp.removeEventListener(Event.SELECT, onUserSelect);
                tmp.removeEventListener(Event.CANCEL, onUserCancel);
                rootDirectory = event.target as File;
            }

            function onUserCancel(event:Event):void
            {
                tmp.removeEventListener(Event.SELECT, onUserSelect);
                tmp.removeEventListener(Event.CANCEL, onUserCancel);
                trace("user canceled");
            }
        }

1 个答案:

答案 0 :(得分:1)

使用匿名或嵌套函数时可能会有一些警告。

第一个也是最重要的是垃圾收集:

在您的示例中,保持tmp对象不被垃圾回收的唯一因素是SELECTCANCEL侦听器本身。由于您没有将弱标志设置为true,因此这不应该是一个问题,但是,如果我们使用弱标志(tmp.addEventListener(Event.SELECT, onUserSelect,false,0,true)),那么tmp对象会有一个不错的更改在用户SELECTS或CANCELS文件之前会收集垃圾。

此外,您必须以这种方式删除所有附加的侦听器。你在onUserCancel方法中这样做,所以它应该没问题,但如果你没有,那么每次你的点击处理程序运行时,你的手都会有内存泄漏,{{1}的另一个实例将被创建,但由于附加了侦听器,它永远不会被垃圾收集。

总而言之,大多数人都远离AS3中的匿名/嵌套方法(我通常/通常会向人们推荐这种方法),因为很容易造成内存泄漏或意外收集关闭垃圾。也可能有或没有性能差异,但我从未在这方面进行过测试。