as3 Доступ к неопределенному свойству?

Может ли кто-нибудь помочь мне выяснить, почему я получаю сообщение об ошибке «Доступ к неопределенному свойству: removeChild (goBack)» в следующем фрагменте кода?

Кстати, это для flash CS4

function nameOfFunction() {

var goBack:backButton_mc = new backButton_mc();

goBack.x = 10;

goBack.y = 700;

goBack.back_text.text = myXML.*[buildingName].NAME;

goBack.name = "backBtn";

goBack.buttonMode = true;


addChild(goBack);

goBack.addEventListener(MouseEvent.CLICK, anotherFunction);

}


function anotherFunction(e:MouseEvent):void {

 removeChild(goBack);

}

Ответов (2)

Решение

Вы ошиблись с размахом. (сюрприз :-D)

Переменная goBack просто определена внутри «nameOfFunction», когда вы пытаетесь получить к ней доступ из другой функции, такой как «anotherFunction», она больше не существует (даже если она находится в списке отображения).

Есть разные возможности решить эту проблему:

function anotherFunction(e:MouseEvent):void {
   removeChild(e.currentTarget);
}

Или лучший способ: продвигать goBack как член класса, выполняющего обе функции. (Или, если вы не используете классы, сделайте goBack «глобальным».)

Бегемот прав, но я считаю важным объяснить немного больше.

Вы создали локальную переменную, например var someVariable: DataType; внутри функции. Это означает, что эта переменная будет доступна только объектам в области видимости (внутри) функции (локально для) и будет действовать только в течение всего времени существования функции. Вскоре после того, как эта функция запустилась, код ушел, пока не запустился снова. Похоже, вы, вероятно, занимаетесь программированием непосредственно внутри флэш-среды IDE на временной шкале, и это нормально, но, если вы использовали класс документа, вы могли бы просто объявить свою переменную в области класса чуть выше функции конструктора, а затем установите значение в той же функции, которую вы используете сейчас. Таким образом, ссылка на переменную не существует внутри функции, она просто устанавливается изнутри. Это позволит получить доступ к этой переменной из любого места в том же классе, даже если установлено значение private.

Это может помочь:

//Frame 1, Actions layer
//Slap goBack right onto the root / stage
var goBack:MovieClip;
/*
I noticed you had this data-typed differently,
i prefer to type to an interface, not an implementation.
Since your class is a movieclip in the library it extends
MovieClip and therefor IS A MovieClip, but ok either way.
*/

function nameOfFunction():void
{
    goBack = new backButton_mc();
    goBack.x = 10;
    goBack.y = 700;
    goBack.back_text.text = myXML.*[buildingName].NAME;
    goBack.name = "backBtn";
    goBack.buttonMode = true;
    addChild(goBack);
    goBack.addEventListener(MouseEvent.CLICK, anotherFunction);
}

function anotherFunction(e:MouseEvent):void
{
    removeChild(goBack);
}

Масштаб очень важен, и через некоторое время с ним легко справиться. Придерживайтесь этого, экспериментируйте, читайте об соглашениях и стандартах, которые могут помочь вам в разработке, и полюбите DocumentClass, потому что, даже если сначала он может показаться некоторым пугающим, как только вы его изучите и привыкнете, это так сложно. Вернемся к программированию во флэш-среде IDE на временной шкале, где, как я полагаю, есть место только для экранных объектов и звука.