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