这是AS3条件编译的错误吗?

时间:2012-03-22 16:24:45

标签: actionscript-3 flex flash-cs4 flashdevelop

在我们的代码中,我有以下内容,现在请忽略//*位;

if (data["someKey"] != null)//*
{
    CONSOLE_OUT.info("Print some stuff.");
    TARGET::myTarget
    {
        var someString:String = data["someKey"] as String;//*
        someController.setSoemthing(someString.indexOf("soemthing") > -1 ? true : false);//*
    }
}

我已将FlashCS4设置为将TARGET::myTarget编译器常量设置为false,这意味着不应编译编译器常量中的代码。在执行点data["someKey"]求值为null意味着if语句不应该执行。

当我调试下面的代码时,执行//*的行,这是一种奇怪的行为。它跳过if语句之后的初始行,并直接执行不应编译的代码,但请记住它不应该输入if语句。它几乎就像编译器常量的存在导致if语句看起来是一行,然后仍然在错误的范围内执行代码。

但是,如果我在结尾添加else语句,代码执行正常;

if (data["someKey"] != null)//*
{
    CONSOLE_OUT.info("Print some stuff.");
    TARGET::myTarget
    {
        var someString:String = data["someKey"] as String;
        someController.setSoemthing(someString.indexOf("soemthing") > -1 ? true : false);
    }
}
else
{
    CONSOLE_OUT.info("Print some other stuff.");
}

还应该注意的是,在data["someKey"]求值为null以外的其他情况下,上述版本将正确跳过(或不编译)常量中的代码。

我只是想知道这是一个错误,还是我没有使用正确的编译器常量语法。如果您需要更多信息,请告诉我。我仔细检查了我的编译器常量,我使用Flash CS4来编译和定位Flash Player 10,如果这有所不同。

2 个答案:

答案 0 :(得分:2)

它不是错误,编译器将删除任何if(false)语句,因此条件常量必须包含在条件评估中。

if (data["someKey"] != null)//*
{
    CONSOLE_OUT.info("Print some stuff.");
    if(TARGET::myTarget) // it should be conditional statement
    {
        var someString:String = data["someKey"] as String;//*
        someController.setSoemthing(someString.indexOf("soemthing") > -1 ? true : false);//*
    }
}

如果你看一下flex样本,他们已经在方法声明之外应用了符号,所以当你在成员体外编写条件编译符号时,会包含/排除成员体,但是如果是内联语句,flex无法确定是什么要排除,所以它应该在if中使用。

在此处查看答案和链接,

Flash/Flex conditional compilation "else"

答案 1 :(得分:-3)

我不确定你在使用TARGET静态类做什么 我从来没有见过这样的东西,也不知道TARGET是什么,我不知道如何纠正它。
无论如何在if语句中测试someKey是否有值,但是如果someKey尚未定义,那么它将不为null undefined。 说到这一点你需要测试它,正确的测试方法就是这样。

if( data.hasOwnProperty("someKey"){
    CONSOLE_OUT.info("Print some stuff.");
    TARGET::myTarget <<<<<<< WTH is this????????
    {
        var someString:String = data["someKey"] as String;
        someController.setSoemthing(someString.indexOf("soemthing") > -1 ? true : false);
    } }

另请注意,字符“/ *”表示注释块的开头,之后的所有代码都将被注释掉。
例如

/* this would be commented
this would be commented
*/
this line would not be commented

[编辑]
注意第一个“ie”是如何将属性显示为未定义的。

trace(null == undefined); //Outputs true
trace(null === undefined); //Outputs false

var i:Object;
trace(i); //Outputs null
i = {};
trace(i); //Outputs [object Object]

var i:Object = {a:"b", c:"d"};
trace(i.e); //Outputs undefined
i.e = "f";
trace(i.e); //Outputs f

reference

相关问题