如何测试一个Function变量是否被设置?

2011-07-01更新:smithfox提醒,这个BUG在Flex SDK4.5/Flash Player 10.3中已经解决(不知道是从什么时候解决的,只能把我发现时候的版本贴出来),Adobe解决的办法也比较BT,就是不带括号调用方法名,不会执行方法。这样的话,以前偷懒的代码都要改过了。

A类需要调用B类中的showInfo方法,使用setShowInfo方法将被调用的方法保存在A类的 _showInfo 变量中,然后在调用该方法的时候判断该方法是否被设置,如果被设置就调用它。代码如下:

 1private var _showInfo:Function;
 2public function setShowInfo($showInfo:Function):void
 3{
 4    _showInfo = $showInfo;
 5}
 6protected function showInfo($msg:String):void
 7{
 8    trace('_showInfo is not null:', _showInfo != null);
 9    if(_showInfo != null)
10        _showInfo($msg);
11}

但这个代码有很大的问题,trace出来的内容居然是:

_showInfo is not null:false

想了想也对,因为 _showInfo 是方法,对方法进行调用(即使不带括号也可以调用),方法是有返回值的,而这个方法的并没有设定返回值(设定为void),也就是说返回值为空,这样就导致了即使_showInfo被设置, _showInfo != null 表达式也会返回空。

至于解决办法,也很简单(setShowInfo就省略了):

1private var _showInfo:Function;
2protected function showInfo($msg:String):void
3{
4    trace('_showInfo is Function:', _showInfo is Function);
5    if(_showInfo is Function)
6        _showInfo($msg);
7}