Существует множество способов обойти это, вы можете использовать объект события
for(var i:int = 0; i < 10; i++) {
var mc:MovieClip = new MovieClip();
mc.addEventLister(MouseEvent.MOUSE_OVER, function(e) {
MovieClip(e.currentTarget).y=-20;
});
}
Или вы можете использовать анонимное закрытие для создания стабильной области видимости переменной:
for(var i:int = 0; i < 10; i++) {
(function(mc:MovieClip):void {
mc.addEventLister(MouseEvent.MOUSE_OVER, function(e) {
mc.y=-20;
});
})(new MovieClip());
}
Или именованная функция, чтобы сделать то же самое:
function attachListenerTo(mc:MovieClip):void {
mc.addEventLister(MouseEvent.MOUSE_OVER, function(e) {
mc.y=-20;
});
}
for(var i:int = 0; i < 10; i++) {
attachListenerTo(new MovieClip());
}
Или вы можете создать подкласс MovieClip и прикрепить прослушиватель событий в связанном контексте:
public dynamic class ChildClass extends MovieClip {
public function ChildClass() {
this.addEventListener(MouseEvent.MOUSE_OVER, handleOver);
}
private function handleOver(e:MouseEvent):void {
this.y = -20;
}
}
// And then
for(var i:uint=0;i<10;i++) {
var mc:MovieClip = new ChildClass();
}
Редактировать
Просто быстрое замечание относительно , почему ваша первая версия терпит неудачу, ActionScript не имеет блоковых областей (в отличие от других языков, таких как C #) и использует подъем переменных.Это означает, что линия var mc:MovieClip
не там, где вы думаете, что она есть.На самом деле есть только одна переменная с именем mc
и она связана с функциональной областью, что означает, что на каждой итерации цикла вы просто переназначаете одну переменную с именем mc
.Поскольку вы создаете анонимную функцию в качестве вашего обработчика, она тоже привязывается к той же области видимости, что и mc
.Вот почему mc
всегда ссылается на последний MovieClip из цикла, к тому моменту, когда вызывается любое из этих замыканий, проходит много времени после завершения цикла и mc
все еще указывает на последний.