2009-09-27 10 views
11

Soy un poco nuevo en Actionscript, pero no puedo entender esto. He realizado muchas búsquedas sobre este tema y no he encontrado una respuesta clara. Probé las siguientes soluciones que las personas publicaron en línea, pero ninguna de ellas funciona.Actionscript3: ¿Existe la variable?

Todos los siguientes soluciones dan el error: 1120: Acceso de propiedad no definida myVariable

Sugerencia # 1:

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

Sugerencia # 2:

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

Sugerencia # 3:

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

Sugerencia # 4:

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

Como dije, he encontrado muchos puestos foros y cosas en línea que dan las sugerencias anteriores que dicen que lo harán trabajo, pero todos parecen darme el mismo 1120: acceso de la propiedad indefinida myVariable error.

Por cierto, en caso de que se pregunte por qué tendría que comprobar si existe una variable o no, estoy planeando pasar variables al archivo SWF en su URL, así que necesito asegurarme de que existan las variables adecuadas y manejar el código correctamente si no se pasan.


Gracias por la respuesta rápida. Todavía no está funcionando realmente. El alcance de la variable está solo en el nivel superior/raíz del script. Básicamente, comienzo a un nuevo archivo flash, en el primer cuadro añado la siguiente acción:

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

Cuando ejecuto el archivo flash, obtengo esta salida:

myVariable exists 
undefined 

me esperaba esto:

declaring variable now... 
Default Value 

Respuesta

5

By the way, in case you are wondering why I would need to check if a variable exists or not, I'm planning on passing variables to the SWF in its URL, so I need to make sure the proper variables exist and handle the code properly if they are not passed in.

Entonces está tomando el enfoque equivocado.Aquí está la manera correcta ™ para leer y validar los parámetros SWF, junto con el valor por defecto si no existen:

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

Advertencia! Dado que esto se retransmite en la propiedad 'etapa', use este código ya sea desde la clase de documento o después de Event.ADDED_TO_STAGE.

+0

¡Esto funcionó a la perfección! ¡Gracias! –

+0

ONe upvote para la marca registrada en 'el camino correcto'. –

12

respuesta de LiraNuna es definitivamente el derecho manera de acceder a los parámetros de la cargadora. Sin embargo, para responder a la pregunta de cómo comprobar la existencia de variables (para la posteridad), esto se realiza con el método hasOwnProperty(), que existe en todos los objetos:

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

Eso debe cubrir su situación. Pero no conozco ninguna forma de verificar la existencia de una variable de la forma en que intentas hacerlo, simplemente haciendo una referencia directamente a la variable. Creo que debes consultarlo a través de su alcance.

0

fenomas es probablemente el más correcto. (Probablemente debería modificar algo de mi código para usar ese método). Pero el método que uso actualmente para las clases es:

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

que no es el más elegante ya que arroja excepciones.

Mi razón para usar este tipo de código es que estamos haciendo un poco de codificación dinámica y abusando de "incluye" en flex para escribir un código repetitivo.

0

rastreo (myVariable);

0

Cuando la etapa no está disponible, puede intentar extraer parámetros de root.loaderInfo.parameters. Asegúrese de verificar si cada propiedad de la cadena es nula.

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

'root' no estará disponible si DisplayObject no forma parte de la lista de visualización. – LiraNuna

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

Nota al operador de triple comparación. Es un pequeño truco que aprendí de mis días de Javascript. También funciona en AS3 y es útil para verificar si el elemento de matriz existe aunque sea nulo. De esta manera:

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

He tenido el mismo problema recientemente, y busqué maneras de solucionarlo. Sin embargo, he encontrado que cuando se registra la variable así ...

var i:int; 

... que no se restablece la variable si ya se ha hecho. Por ejemplo, si este es mi código en el fotograma 1:

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

A continuación, estos serán los valores de "i" cada vez que el flash se remonta en el mismo período:

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

Se trabajó en mi propio proyecto, y es MUCHO menos código que la respuesta anterior. Espero que funcione para ti tambien.

Cuestiones relacionadas