【发布时间】:2010-12-12 09:45:58
【问题描述】:
我从 JS 世界来到 AS3,我应该承认匿名函数是我的弱点。我倾向于在任何地方使用它们。现在,来到 AS3,我在很多地方听到和读到,AS 和 Flash 在处理垃圾收集方面非常糟糕,应该手动清空、处理和删除所有事件处理程序和对象,以避免奇怪和无法解释的内存泄漏和崩溃。不确定这其中的哪一部分是正确的,但我想从一开始就遵循最佳做法。
所以我的问题是 - 使用匿名函数作为事件处理程序的想法有多糟糕?例如,考虑这样的代码:
addEventListener(Event.ENTER_FRAME, function() : void {
controls.elapsed = stream.time;
});
contorls.elapsed 是设置器,除了设置视频播放器的当前播放时间外,还会更新整个 UI,stream 是 NetStream 对象,流式传输实际视频。
还有很多其他地方可以使用匿名函数使代码更简洁、更直观。检查以下代码以获得控制栏的简单淡入效果:
public function showControls() : void
{
var self:Controls = this;
if (!visible) {
visible = true;
fadeTimer = new Timer(30, 10);
fadeTimer.addEventListener(TimerEvent.TIMER, function() : void {
self.alpha += 0.1;
});
fadeTimer.addEventListener(TimerEvent.TIMER_COMPLETE, function() : void {
self.alpha = 1;
});
fadeTimer.start();
}
}
我非常喜欢它的外观并适合代码,但我担心泄漏。虽然 Event.ENTER_FRAME 处理程序可能永远不会以这种形式变得有害,但计时器侦听器呢。我应该手动删除这些侦听器,还是一旦我设置 fadeTimer = null 就会自动删除它们?是否可以完全删除带有匿名函数的侦听器?
【问题讨论】:
-
我不喜欢匿名函数。一方面,它们很丑,你也不能在其他地方重用该函数(可能导致重复代码),最后,它们创建了一个对性能和内存有一些影响的激活对象。 onflex.org/ACDS/AS3TuningInsideAVM2JIT.pdf
-
AS 中有什么东西不会对性能和内存造成影响吗? :) 好吧,在我的理解中,匿名函数只有在不需要重用这些函数、不想弄乱类定义并希望将整个逻辑保存在一个地方时才有用。这就是我倾向于使用它们的方式和时间。感谢您的链接,我会检查它。
-
嗯......“一些性能和内存影响”实际上是一个引用。现在是什么样的声明? “一些”是什么意思?如果按照它的意思来解读,那么“一些”听起来可以忽略不计。或没有?多么模糊。
-
似乎“激活对象”并非特定于 AS,而是 ECMA 标准的一部分。并且也为 JS 中的匿名函数创建。但这并不能阻止网络上的每个人使用它,对吧?或者,该功能的 AS 实现可能是错误且缓慢的?
标签: actionscript-3 event-handling anonymous-function