Actionscript3:变量是不是存在?

Posted

技术标签:

【中文标题】Actionscript3:变量是不是存在?【英文标题】:Actionscript3: Does variable exist?Actionscript3:变量是否存在? 【发布时间】:2010-12-01 18:07:57 【问题描述】:

我对 Actionscript 有点陌生,但我无法弄清楚这一点。我已经对这个主题进行了很多搜索,但没有找到明确的答案。我已经尝试了人们在网上发布的以下解决方案,但它们都不起作用。

以下所有解决方案都会给出错误:1120: Access of undefined property 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

【问题讨论】:

【参考方案1】:

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 );

这应该涵盖您的情况。但是我不知道有任何方法可以像您尝试做的那样检查变量的存在,只需直接引用变量即可。我相信你必须通过它的范围来引用它。

【讨论】:

【参考方案2】:

顺便说一句,如果你想知道 为什么我需要检查一个 变量存在与否,我正在计划 关于将变量传递给 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 之后的代码。

【讨论】:

【参考方案3】:

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

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

这不是最优雅的,因为它确实会引发异常。

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

【讨论】:

【参考方案4】:

跟踪(我的变量);

【讨论】:

【参考方案5】:

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

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

【讨论】:

如果 DisplayObject 不是显示列表的一部分,root 将不可用。【参考方案6】:
    if (myVariable === "undefined") 
      trace("variable doesn't exist");
    else
      trace("variable exists");

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

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

【讨论】:

【参考方案7】:

我最近遇到了同样的问题,我正在寻找解决此问题的方法。但是,我发现当您像这样注册变量时......

var i:int;

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

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

那么这些将是每次 flash 回到同一帧时“i”的值:

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

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

【讨论】:

以上是关于Actionscript3:变量是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

(ActionScript 3.0)我的函数没有通过按钮事件更新全局变量

是否可以将 Class 放入一个变量中并在 actionscript3 中访问该类的静态变量和函数?

【java安卓】怎么调用另一个安卓activity的对象?

PHP 无法从 ActionScript3 接收参数

AS3:检查变量是不是属于 Object 类型

actionscript3 ArgumentError:错误 #2015:位图数据无效