11

我对 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
4

7 回答 7

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

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

于 2009-09-27T05:17:04.250 回答
5

顺便说一句,如果您想知道为什么我需要检查变量是否存在,我计划在其 URL 中将变量传递给 SWF,因此我需要确保存在正确的变量并处理代码如果它们没有通过,则正确。

那么你采取了错误的方法。这是读取和验证 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;
}

警告!由于这依赖于“舞台”属性,因此请使用 Document Class 或 after 中的此代码Event.ADDED_TO_STAGE

于 2009-09-27T05:26:02.797 回答
0

跟踪(我的变量);

于 2010-09-07T04:19:34.660 回答
0

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

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...

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

于 2015-03-07T18:29:05.333 回答
0

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

if( root != null && root.loaderInfo != null && root.loaderInfo.parameters != null ) {
     myVar = root.loaderInfo.parameters.myVar;
}
于 2011-02-11T23:34:35.620 回答
0

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

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

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

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

于 2009-09-27T05:36:59.967 回答
0
    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
于 2011-05-25T16:13:27.063 回答