将匿名函数放在AS3中的方法中是不是一个坏主意?

时间:2013-10-21 15:53:13

标签: actionscript-3 memory-management iterator closures anonymous-function

我决定最近在一些迭代器上使用所有jQuery *,例如:

// forEach being a built-in method of myList that iterates over its members.
myList.forEach(function(i:ListItem):void {
    // Do something with i.
});

但是,由于每个帧都调用了一些代码,因此我在配置文件时会发现很多闭包分配。我想在性能方面最小化GC,但我假设我能做到的唯一方法是使用命名函数而不是匿名函数?如果必须,那么我必须,但它只是感觉笨重而且很难遵循,特别是因为其中一些方法最终有嵌套迭代器,即myList的成员本身就是类似于Array的对象,我需要迭代他们的成员也是。我是否真的需要做类似下面的事情?

function enterFrame(e:Event):void {
    myList.forEach(iterator1);
}

function iterator1(i:ListItem):void {
    i:forEach(iterator2);
}

function iterator2(j:ListItemItem):void {
    // Do stuff with j.
}

*编辑:让我澄清一下。我在使用Actionscript 3,而不是Javascript。我指的是我的代码结构受到jQuery经验的启发,jQuery在其文档中积极鼓励使用匿名函数作为回调,如经典$(document).ready(function() {});

1 个答案:

答案 0 :(得分:2)

This is what Adobe has to say关于文字/匿名函数(它们称为函数表达式)。如果您知道自己在做什么,关于垃圾收集和性能,那么IMO应该没有问题。

在您的特定情况下,考虑每次调用forEach()时都会创建一个新对象,并在列表/子列表的每个元素中调用一个新函数(匿名与否)。

还要考虑使用AS3的动态属性(例如:无类型的变量,动态类,如Object,匿名函数等)会影响性能。当然,这些事情在小型项目中并不明显。 Haxe,这是一种严格类型的AS3类似语言,也可以编译为SWF,执行得更好,因为它丢弃了大部分动态功能(不是全部)。

相关问题