Actionscript3:变量是否存在?

时间:2009-09-27 05:07:50

标签: flash actionscript-3 variables adobe exists

我对Actionscript有点新意,但我无法想出这个。我已就此主题进行了大量搜索,但未找到明确的答案。我尝试了以下人们在网上发布的解决方案但没有一个能够正常工作。

所有以下解决方案都会出错: 1120:访问未定义的属性myVariable

建议#1:

try {
     trace(myVariable); }
catch {
     trace("your variable doesn't exist"); }

建议#2:

if (myVariable) {
     trace("your variable exists!!"); }
else {
     trace("it doesn't exist"); }

建议#3:

if ( myVariable == null )
     trace("your variable doesn't exist");

建议#4:

if ( myVariable == undefined )
     trace("your variable doesn't exist");

就像我说的那样,我发现很多论坛帖子和在线内容提供上述建议说他们会工作,但他们似乎都给了我同样的 1120:访问未定义的属性myVariable 错误。

顺便说一下,如果你想知道为什么我需要检查变量是否存在,我打算在其URL中将变量传递给SWF,所以我需要确保存在适当的变量并且如果没有传入代码,请正确处理代码。


感谢您的快速回复。仍然没有真正的工作。变量的范围仅在脚本的顶级/根级别。基本上,我启动一个新的flash文件,在第一帧我添加了以下操作:

// to check for this.myVariable
if ( this.hasOwnProperty( "myVariable" ) ) {
     trace("myVariable exists");
}
else
{
     //Variable doesn't exist, so declare it now
     trace("declaring variable now...");
     var myVariable = "Default Value";
}

trace(myVariable);

当我运行flash文件时,我得到了这个输出:

myVariable exists
undefined

我在期待这个:

declaring variable now...
Default Value

7 个答案:

答案 0 :(得分:12)

LiraNuna的答案绝对是访问加载程序参数的正确方式。但是,要回答如何检查变量是否存在的问题(对于子孙后代),这是通过hasOwnProperty()方法完成的,该方法存在于所有对象上:

// to check for this.myVariable
if ( this.hasOwnProperty( "myVariable" ) ) {
    trace("myVariable exists");
} else {
    //Variable doesn't exist, so declare it now
    trace("declaring variable now...");
    this.myVariable = "Default Value";
}

trace( this.myVariable );

这应该涵盖你的情况。但我不知道有什么方法可以通过直接对变量进行引用来检查变量是否存在。我相信你必须通过它的范围来引用它。

答案 1 :(得分:5)

  顺便说一句,如果你想知道的话   为什么我需要检查一下   变量存在与否,我正在计划中   将变量传递给其中的SWF   URL,所以我需要确保正确   变量存在并处理代码   如果他们没有被传入则适当。

然后你采取了错误的方法。这是正确的方法™,用于读取和验证SWF参数,以及默认值(如果它们不存在):

private function parameter(name:String, defaultValue:String):String
{
        // Get parameter list
    var paramObj:Object = LoaderInfo(stage.loaderInfo).parameters;

        // Check if parameter exists
    if(paramObj.hasOwnProperty(name) && paramObj[name] != "")
        return paramObj[name];                     
    else
        return defaultValue;
}

警告!由于这是“舞台”属性的中继,因此请使用文档类或Event.ADDED_TO_STAGE之后的代码。

答案 2 :(得分:0)

fenomas可能是最正确的。 (我应该修改我的一些代码来使用该方法)。但我目前用于课程的方法是:

try {
  if(this["myFunction") {
    this["myFunction"]();
  }
catch(e:Error) {}

这不是最优雅的,因为它会抛出异常。

我使用这种代码的原因是我们正在做一些动态编码并在flex中滥用“includes”来编写样板代码。

答案 3 :(得分:0)

迹(MYVARIABLE);

答案 4 :(得分:0)

当stage不可用时,您可以尝试从root.loaderInfo.parameters中提取参数。注意检查链的每个属性是否为空。

if( root != null && root.loaderInfo != null && root.loaderInfo.parameters != null ) {
     myVar = root.loaderInfo.parameters.myVar;
}

答案 5 :(得分:0)

    if (myVariable === "undefined") {
      trace("variable doesn't exist");
    else
      trace("variable exists");

请注意三重比较运算符。这是我从Javascript时代学到的一个小技巧。也适用于AS3,它有助于检查数组元素是否存在,即使为null。像这样:

var array:Array = ["zero", 1, null];
if (array[2]) //returns false
if (array[2] !==  "undefined") //returns true

答案 6 :(得分:0)

我最近遇到了同样的问题,我找到了解决这个问题的方法。但是,我发现当你注册这个变量时......

var i:int;

...如果变量已经完成,它不会重置变量。例如,如果这是我在第1帧上的代码:

var i:int;
if (i > 0){
    i++;
} else {
    i = 1;
}

然后这些将是" i"每次闪光回到同一帧时:

// First Iteration
trace(i); // 1
// Second Iteration
trace(i); // 2
// Third
trace(i); // 3, etc...

它在我自己的项目中工作,并且它比以前的答案少了很少的代码。我希望它对你也有用。