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

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:如何测试一个Function变量是否被设置?
  • 本文链接:http://zengrong.net/post/1165.htm

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


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

private var _showInfo:Function;
public function setShowInfo($showInfo:Function):void
{
    _showInfo = $showInfo;
}
protected function showInfo($msg:String):void
{
    trace('_showInfo is not null:', _showInfo != null);
    if(_showInfo != null)
        _showInfo($msg);
}

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

_showInfo is not null:false

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

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

private var _showInfo:Function;
protected function showInfo($msg:String):void
{
    trace('_showInfo is Function:', _showInfo is Function);
    if(_showInfo is Function)
        _showInfo($msg);
}