0

我最近决定在一些迭代器上使用所有 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本身就是类似数组的对象,我也需要迭代它们的成员。我真的必须做类似下面的事情吗?

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 经验的启发,在其文档中积极鼓励使用匿名函数作为回调,就像在经典$(document).ready(function() {});

4

1 回答 1

2

这就是 Adob​​e对文字/匿名函数(他们称之为函数表达式)的看法。如果您知道自己在做什么,关于垃圾收集和性能,IMO 应该没有问题。

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

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

于 2013-10-21T18:42:43.167 回答