2009-09-27 6 views
11

Я немного новичок в Actionscript, но я не могу понять этого. Я много искал эту тему и не нашел четкого ответа. Я пробовал следующие решения, которые люди выкладывали в Интернете, но никто из них не работает.Actionscript3: Существует ли переменная?

Всего следующих решения дают ошибку: 1120: Доступ неопределенного свойства MYVARIABLE

Предложение # 1:

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

Suggestion # 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 ошибка.

Кстати, на случай, если вам интересно, почему мне нужно проверить, существует ли переменная или нет, я планирую передать переменные SWF в свой URL, поэтому мне нужно убедиться, что существуют соответствующие переменные и надлежащим образом обрабатывать код, если они не переданы.


Благодарим за быстрый ответ. Все еще не работает. Объем переменной находится только на верхнем/корневом уровне скрипта. В принципе, я начинаю новый флэш-файл, на первом кадре я добавить следующее действие:

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

Когда я запускаю файл прошивки, я получаю этот выход:

myVariable exists 
undefined 

Я ожидал этого:

declaring variable now... 
Default Value 

ответ

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.

Тогда вы принимаете неправильный подход.Вот правильный путь ™ для чтения и проверки параметров 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; 
} 

Внимание! Поскольку это реле относится к свойству «stage», используйте этот код либо из класса документа, либо после Event.ADDED_TO_STAGE.

+0

Это сработало отлично! Благодаря! –

+0

ОДНА ВЫДЕРЖКА для товарного знака на «правильном пути». –

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

Это должно покрыть вашу ситуацию. Но я не знаю, как можно проверить существование переменной так, как вы пытаетесь сделать, просто сделав ссылку непосредственно на эту переменную. Я считаю, что вы должны сослаться на нее в своих масштабах.

0

fenomas, вероятно, самый правильный. (Я должен, вероятно, изменить некоторые из моего кода, чтобы использовать этот метод). Но метод, который я использую в настоящее время для классов, является следующим:

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

, который не является самым элегантным, поскольку он делает исключение.

Моей причиной для использования такого кода является то, что мы делаем немного динамического кодирования и злоупотребляем «включенными» в flex, чтобы написать шаблонный код.

0

Когда этап недоступен, вы можете попытаться извлечь параметры из root.loaderInfo.parameters. Постарайтесь проверить, является ли каждое свойство цепочки нулевым.

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

'root' не будет доступен, если DisplayObject не является частью списка отображения. – LiraNuna

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

Примечание тройной оператор сравнения. Это небольшой трюк, который я узнал из своих дней Javascript. Также работает в AS3, и это полезно для проверки того, существует ли элемент массива, даже если значение null. Например:

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

У меня была такая же проблема в последнее время, и я искал способы исправить это. Тем не менее, я обнаружил, что, когда вы регистрируетесь переменную как так ...

var i:int; 

... что он не сбрасывает переменную, если она уже была сделана. Например, если это мой код в Кадр 1:

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

Тогда это будут значения «я» каждый раз, когда вспышка возвращается через тот же кадр:

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

Он работал в моем собственный проект, и это намного меньше кода, чем предыдущий ответ. Надеюсь, это сработает и для вас.