gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:30:42 24 4
gpt4 key购买 nike

我刚刚发现了 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");
}
}

最佳答案

使用匿名或嵌套函数时可能会有一些注意事项。

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

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

此外,您必须删除以这种方式附加的每个监听器。您在 onUserCancel 方法中执行此操作,所以它应该没问题,但如果您没有这样做,那么每次您的点击处理程序运行时,您的手上都会发生内存泄漏, tmp 将被创建,但由于附加到它的监听器,它永远不会被垃圾收集。

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

关于actionscript-3 - 将嵌套函数与事件监听器一起使用有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27004204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com