【问题标题】:Is it a bad idea to put anonymous functions inside a method in AS3?将匿名函数放在 AS3 的方法中是不是一个坏主意?
【发布时间】:2013-10-21 15:53:12
【问题描述】:

我最近决定在一些迭代器上使用所有 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() {});

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我正在使用 Nape 物理库,我认为它为其 forEach() 方法创建了一个可重用的 Iterator 对象。不过,你的其他观点很好。我可能只需要看看是否有任何东西会造成性能问题。我正在尝试最大程度地减少潜在的内存/GC 减速问题,因为我最终将部署到移动设备上,并且我正在制作一款非常复杂的游戏,并且随之而来的是进一步的内存分配,还有待补充。
    猜你喜欢
    • 2016-12-08
    • 2011-08-16
    • 1970-01-01
    • 2021-01-18
    • 2014-03-23
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多