Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在eventlisteners中使用嵌套函数是否存在任何问题?_Actionscript 3_Apache Flex_Flex4 - Fatal编程技术网

Actionscript 3 在eventlisteners中使用嵌套函数是否存在任何问题?

Actionscript 3 在eventlisteners中使用嵌套函数是否存在任何问题?,actionscript-3,apache-flex,flex4,Actionscript 3,Apache Flex,Flex4,我刚刚在AS3中发现了嵌套函数(是的,很晚才发现),并在Flex项目中使用它们。我一直不喜欢在EventListener中使用单独的函数进行本质上的模态操作——这会给代码增加混乱,分离操作逻辑,并且不能轻松地引用局部变量 下面这个用户选择目录的例子似乎工作得很好,很紧凑,但我想知道这种方法是否有我不知道的问题。此外,对于非模式操作(例如异步操作,如使用加载程序),是否可以使用嵌套函数 private var rootDirectory:File; protect

我刚刚在AS3中发现了嵌套函数(是的,很晚才发现),并在Flex项目中使用它们。我一直不喜欢在EventListener中使用单独的函数进行本质上的模态操作——这会给代码增加混乱,分离操作逻辑,并且不能轻松地引用局部变量

下面这个用户选择目录的例子似乎工作得很好,很紧凑,但我想知道这种方法是否有我不知道的问题。此外,对于非模式操作(例如异步操作,如使用
加载程序
),是否可以使用嵌套函数

        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");
            }
        }

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

首先也是最重要的是垃圾收集:

在您的示例中,唯一阻止
tmp
对象被垃圾收集的是
SELECT
CANCEL
侦听器本身。由于您没有将弱标志设置为true,因此这应该不是问题,但是,如果您使用弱标志(
tmp.addEventListener(Event.SELECT,onUserSelect,false,0,true)
),那么在用户选择或取消文件之前,
tmp
对象将被垃圾收集

此外,您必须删除以这种方式连接的每个侦听器。您正在使用
onUserCancel
方法执行此操作,因此应该可以,但如果不这样做,则会导致内存泄漏,因为每次运行单击处理程序时,都会创建
tmp
的另一个实例,但它不会被垃圾收集,因为它附带了侦听器


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

如果您知道该函数的范围,并确保没有造成内存泄漏,那么就可以了。您可以在Loader上使用它们,但通常唯一阻止它被垃圾收集的是侦听器本身,因此您不能使用弱侦听器,您绝对需要确保在闭包中删除侦听器,否则它将永远留在内存中。在AS3中,大多数人都远离它们(我通常建议大家这样做),因为很容易造成内存泄漏或意外地将闭包垃圾收集。@LDMS–谢谢!这是关于由于GC而不使用弱引用的非常详细的信息,并且是完全有意义的。在发布这篇文章之后,我尝试将嵌套函数与加载器一起使用,虽然处理所有可能的事件会导致代码本身足够大,足以成为一个类,但它工作得很好。但是对于像处理用户响应这样愚蠢的小事情,我真的很喜欢这种嵌套方法(并帮助我减少对eventListeners的憎恨;-)