Actioncript3: Существует ли переменная?

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

Все следующие решения дают ошибку: 1120: доступ к undefined свойству 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: доступ к ошибке undefined myVariable.

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

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

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

Ответ 1

Кстати, если вам интересно почему мне нужно будет проверить, переменная существует или нет, я планирую о передаче переменных в 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;
}

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

Ответ 2

Ответ 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 );

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

Ответ 3

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

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

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

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

Ответ 4

след (MyVariable);

Ответ 5

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

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

Ответ 6

    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

Ответ 7

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

var i:int;

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

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

Тогда это будут значения "i" каждый раз, когда флэш возвращается по одному и тому же кадру:

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

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