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...
Он работал в моем собственном проекте, и это намного меньше кода, чем предыдущий ответ. Я надеюсь, что это сработает и для вас.