2010-05-07 39 views
0

最近我需要调用一个侦听器函数没有实际的监听器,如下:AS3:性能问题调用带有空PARAM事件功能

foo(null); 

private function foo(event:Event):void 
{ 
    //do something 
} 

所以我在想,如果有对此之间的性能显著差异并用下面的,我在其中能防止空呼吁没有监听的功能,但我仍然能够与听众也称之为:

foo(); 

private function foo(event:Event = null):void 
{ 
} 

我不知道羯羊,这只是一个问题风格,或实际上不好的做法,我应该wr迭代两个相似的函数,一个和一个没有事件参数(这看起来很麻烦)。

期待您的意见,thx。

+0

我通常这样做我自己。它似乎对性能没有任何影响。它的方式比拥有2个类似的功能更好 - 可管理性更好。 – Shiki 2010-05-07 09:51:03

+2

@Shiki:我不同意。它不分离责任。场景:如果您决定使用该函数作为事件处理函数,并作为第一类方法,然后决定,您希望实际评估处理程序中的某些事件数据,则确实存在问题。请看我的帖子的后半部分。 – back2dos 2010-05-07 11:12:44

+0

+1 @ back2dos好点。如果你的处理程序做了很多事情,它确实会促成一个问题。我通常只为相对较小的功能做这个。 – Shiki 2010-05-08 04:53:35

回答

0

这两个编译到完全相同的字节码。我检查了一个二进制差异。

+0

伟大的输入家伙,非常感谢! – adehaas 2010-05-07 11:18:26

2

由于bitc声明,没有区别。请注意,严格类型调用中只有这种情况,编译器可以在编译时确定默认参数,并实际包含缺省值作为参数。

当呼叫是无类型的,播放器必须在运行时查找默认参数,与所有需要在运行时执行的运行时类型检查/转换相比,这确实花费了一些速度,但可能不应该太多这样的情况。

但是,这不是一个好的做法。你应该把它分成两个功能。一个接收事件并从中提取必要的数据,然后将其传递给另一个函数,该函数将实际处理它。该函数内的实际逻辑变得更加可重用。重构也变得更容易,因为您可以简单地移动该函数(如pull up)而不会破坏代码。最后但并非最不重要的是,它显然分离了责任。

当然,如果对事件的实际响应是什么,既不处理事件也不是太复杂,比分裂有点夸大。

格尔茨
back2dos