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)我的函数没有通过按钮事件更新全局变量