5

为什么在 Actionscript 中很少使用内联闭包?它们非常强大,我认为非常具有可读性。我几乎看不到有人使用它们,所以也许我只是在看错误的代码。Google 在他们的 Google Maps API for Flash 示例中使用它们,但我认为那是我见过它们的唯一地方。

我喜欢它们,因为您可以访问定义它们的范围内的局部变量,并且您将逻辑保留在一种方法中,并且最终不会产生许多您必须为其命名的函数。

使用它们有什么注意事项吗?它们的工作方式与 C# 中的工作方式几乎相同吗?

实际上我才刚刚发现 AS3 支持它们,我很生气,因为我以为我读到它们在 AS# 中已被弃用。所以我又开始使用它们了!

private function showPanel(index:int):void {    

_timer = new Timer(1000, 1);        
_timer.addEventListener(TimerEvent.TIMER, function(event:Event):void 
{
    //  show the next panel
    showPanel(index++);
});
4

3 回答 3

3

需要注意的最大问题是内联闭包中通常没有定义“this”。有时您可以设置一个“this”,但并不总是可以设置正确的“this”,这取决于您使用它们的方式。

但我要说的是,我处理过的大多数 Flex 代码在整个代码中都有大量的内联闭包——因为回调是完成工作的唯一方法,而且通常你不需要带出一个完整的单独函数.

有时当嵌套的函数太多时,我会用函数中的函数变量稍微打破它;这有助于我通过为函数提供标签但保留内联闭包的一些特征(例如访问局部变量)来组织一点。

希望这可以帮助。

于 2008-10-17T21:34:41.313 回答
2

另一个问题是,当涉及到闭包时,垃圾收集被破坏了(至少在 Flash 9 中)。给定闭包的第一个实例(从词法的角度来看)永远不会被垃圾收集 - 以及范围链中闭包引用的任何其他内容。

于 2008-10-27T22:30:23.127 回答
1

我找到了最初让我不想这样做的原因,但我忘记了细节:

http://livedocs.adobe.com/flex/3/html/16_Event_handling_6.html#119539

(这就是米奇提到的——就“this”关键字超出范围而言)

这就是 Adob​​e 的答案,但是我更可能需要引用局部变量而不是“this”。

其他人如何解读 Adob​​e 的建议?

于 2008-10-17T21:43:33.060 回答