2009-02-26 1 views
0

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

Кстати, это для флэш-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); 

} 

ответ

1

Вы не правы с областью. (сюрприз: -D)

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

Существуют различные возможности для решения этой проблемы:

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

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

1

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

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

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

//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, потому что, хотя сначала это может быть сложным для некоторых, как только вы изучите его и привыкнете к нему, ему так трудно идти вернемся к программированию в Flash IDE на временной шкале, где я считаю, что только объекты отображения и аудио имеют какое-либо место.