2009-09-27 10 views
11

Sono un po 'nuovo in Actionscript, ma non riesco a capirlo. Ho fatto molte ricerche su questo argomento e non ho trovato una risposta chiara. Ho provato le seguenti soluzioni che le persone hanno pubblicato online ma nessuno di loro funziona.Actionscript3: esiste una variabile?

Tutte le seguenti soluzioni danno l'errore: 1120: L'accesso alla proprietà non definita myVariable

Suggerimento # 1:

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

Suggerimento # 2:

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

Suggerimento # 3:

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

Suggerimento # 4:

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

Come ho detto, ho trovato molti forum post e roba online che danno i suggerimenti sopra dicendo che lo faranno lavoro, ma sembra che mi stiano dando sempre lo stesso 1120: accesso alla proprietà non definita myVariable errore.

In ogni caso, nel caso ti stia chiedendo perché avrei bisogno di controllare se esiste una variabile o meno, sto pianificando di passare variabili al SWF nel suo URL, quindi devo assicurarmi che esistano le variabili corrette e gestire il codice correttamente se non vengono inoltrati.


Grazie per la risposta rapida. Ancora non funziona davvero. L'ambito della variabile è solo sul livello superiore/root dello script. Fondamentalmente, mi metto un nuovo file flash, sul primo fotogramma aggiungo le seguenti azioni:

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

Quando eseguo il file flash, ottengo questo output:

myVariable exists 
undefined 

mi aspettavo questo:

declaring variable now... 
Default Value 

risposta

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.

Quindi stai prendendo l'approccio sbagliato.Ecco il modo giusto ™ per leggere e convalidare i parametri SWF, insieme al valore di default, se non esistono:

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

Attenzione! Poiché questo inoltra la proprietà "stage", utilizzare questo codice dalla Document Class o dopo Event.ADDED_TO_STAGE.

+0

Questo ha funzionato perfettamente! Grazie! –

+0

ONe upvote per il marchio "nel modo giusto". –

12

risposta di LiraNuna è sicuramente la giusta modo per accedere ai parametri del caricatore. Tuttavia, per rispondere alla domanda di come verificare l'esistenza di variabili (per i posteri), questo viene fatto con il metodo hasOwnProperty(), che esiste su tutti gli oggetti:

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

che dovrebbe coprire la vostra situazione. Ma non conosco alcun modo per verificare l'esistenza di una variabile nel modo in cui stai tentando di fare, semplicemente facendo un riferimento direttamente alla variabile. Credo che tu debba fare riferimento ad esso attraverso il suo scopo.

0

la fenoma ha probabilmente la maggior ragione. (Probabilmente dovrei modificare parte del mio codice per usare quel metodo). Ma il metodo che attualmente uso per le classi è:

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

che non è il più elegante in quanto lo fa generare eccezioni.

Il motivo per cui utilizzo questo tipo di codice è che stiamo eseguendo un po 'di codifica e abusi dinamici "include" in flex per scrivere codice di codice.

0

trace (myVariable);

0

Quando stage non è disponibile, è possibile provare a estrarre i parametri da root.loaderInfo.parameters. Fai attenzione a verificare se ogni proprietà della catena è nullo.

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

'root' non sarà disponibile se DisplayObject non fa parte dell'elenco di visualizzazione. – LiraNuna

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

Nota l'operatore triplo confronto. È un piccolo trucco che ho imparato dai miei giorni in Javascript. Funziona anche in AS3 ed è utile per verificare se l'elemento array esiste anche se null. In questo modo:

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

Ho avuto lo stesso problema di recente, e ho cercato modi per risolvere questo problema. Tuttavia, ho trovato che quando si registra la variabile in questo modo ...

var i:int; 

... che non azzera la variabile se è già stato fatto. Per esempio, se questo è il mio codice nel fotogramma 1:

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

Poi questi saranno i valori della "i" ogni volta che il flash ripercorre lo stesso telaio:

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

Ha funzionato nel mio proprio progetto, ed è un codice molto meno rispetto alla risposta precedente. Spero che funzioni anche per te.

Problemi correlati