Actionscript 3 AS3 for循环中的单个事件侦听器

Actionscript 3 AS3 for循环中的单个事件侦听器,actionscript-3,for-loop,event-listener,Actionscript 3,For Loop,Event Listener,我找不到更好的标题来描述我的问题 我想做到这一点: for(var i:int = 0; i < 10; i++) { var mc:MovieClip = new MovieClip(); mc.addEventLister(MouseEvent.MOUSE_OVER, function() { mc.y=-20; }); } for(变量i:int=0;i

我找不到更好的标题来描述我的问题

我想做到这一点:

for(var i:int = 0; i < 10; i++) {
     var mc:MovieClip = new MovieClip();
     mc.addEventLister(MouseEvent.MOUSE_OVER, function() {
        mc.y=-20;
     });
}
for(变量i:int=0;i<10;i++){
var mc:MovieClip=新的MovieClip();
mc.addEventLister(MouseEvent.MOUSE_OVER,function()){
mc.y=-20;
});
}
我的问题是mc总是引用在for循环中创建的最后一个mc,因此创建的第一个mc会导致最后一个mc在鼠标上方移动。也许我可以用“这个”或“自我”


有什么建议吗?

您想这样做:

for(var i:int = 0; i < 10; i++) {
     var mc:MovieClip = new MovieClip();
     mc.addEventLister(MouseEvent.MOUSE_OVER, function(evt:Event) {
        evt.currentTarget.y=-20;
     });
}
for(变量i:int=0;i<10;i++){
var mc:MovieClip=新的MovieClip();
mc.addEventLister(MouseEvent.MOUSE_OVER,函数(evt:Event){
evt.currentTarget.y=-20;
});
}

请注意,我没有使用
mc
而是使用事件的
currentTarget
,这就是我们添加事件侦听器的地方。

您希望执行以下操作:

for(var i:int = 0; i < 10; i++) {
     var mc:MovieClip = new MovieClip();
     mc.addEventLister(MouseEvent.MOUSE_OVER, function(evt:Event) {
        evt.currentTarget.y=-20;
     });
}
for(变量i:int=0;i<10;i++){
var mc:MovieClip=新的MovieClip();
mc.addEventLister(MouseEvent.MOUSE_OVER,函数(evt:Event){
evt.currentTarget.y=-20;
});
}

请注意,我没有使用
mc
而是使用事件的
currentTarget
,这就是我们添加事件侦听器的地方。

有很多方法可以解决这个问题,您可以使用事件对象

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(变量i:int=0;i<10;i++){
var mc:MovieClip=新的MovieClip();
mc.addEventLister(MouseEvent.MOUSE_,函数(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());
}
for(变量i:int=0;i<10;i++){
(功能(mc:MovieClip):无效{
mc.addEventLister(MouseEvent.MOUSE_,函数(e){
mc.y=-20;
});
})(新电影剪辑());
}
或命名函数来执行相同的操作:

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());
}
函数附件ListenerTo(mc:MovieClip):无效{
mc.addEventLister(MouseEvent.MOUSE_,函数(e){
mc.y=-20;
});
}
对于(变量i:int=0;i<10;i++){
附件(新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();
}
公共动态类ChildClass扩展了MovieClip{
公共函数子类(){
this.addEventListener(MouseEvent.MOUSE_OVER,handleOver);
}
私有函数handleOver(e:MouseEvent):无效{
y=-20;
}
}
//然后

对于(var i:uint=0;i有很多方法可以解决这个问题,您可以使用事件对象

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(变量i:int=0;i<10;i++){
var mc:MovieClip=新的MovieClip();
mc.addEventLister(MouseEvent.MOUSE_,函数(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());
}
for(变量i:int=0;i<10;i++){
(功能(mc:MovieClip):无效{
mc.addEventLister(MouseEvent.MOUSE_,函数(e){
mc.y=-20;
});
})(新电影剪辑());
}
或命名函数来执行相同的操作:

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());
}
函数附件ListenerTo(mc:MovieClip):无效{
mc.addEventLister(MouseEvent.MOUSE_,函数(e){
mc.y=-20;
});
}
对于(变量i:int=0;i<10;i++){
附件(新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();
}
公共动态类ChildClass扩展了MovieClip{
公共函数子类(){
this.addEventListener(MouseEvent.MOUSE_OVER,handleOver);
}
私有函数handleOver(e:MouseEvent):无效{
y=-20;
}
}
//然后

对于(var i:uint=0;i此解决方案存在一个潜在问题,即使用当前编码,您将只能访问上次创建的mc,例如,如果您希望删除事件侦听器以便movieclips有资格进行垃圾收集。另一个解决方案是将每个mc添加到一个数组中。即mcArray.push(mc);然后,您可以在阵列中循环,访问mc的每个实例。是的,此解决方案容易出现内存泄漏,但原始实现和此处建议的其他一些实现也是如此。如果您将MovieClips添加到后台,直到应用程序结束,则不会出现任何问题。或者您可以简单地添加事件侦听器
usewakreference
设置为true。例如
addEventLister(MouseEvent.MOUSE_OVER,false,0,true)
此解决方案存在一个潜在问题,即使用当前编码,您将只能访问上次创建的mc,例如,如果您希望删除事件侦听器,以便movieclips有资格进行垃圾收集。另一个解决方案是将每个mc添加到一个数组中。即mcArray.push(mc);然后,您可以在阵列中循环,访问mc的每个实例。是的,此解决方案容易出现内存泄漏,但原始实现和此处建议的其他一些实现也是如此。如果您将MovieClips添加到后台,直到应用程序结束,则不会出现任何问题。或者您可以简单地添加事件侦听器
usewakreference
设置为true。例如
addEventLister(MouseEvent.MOUSE_OVER,false,0,true)
+1为“匿名闭包创建稳定变量范围”答案!您刚刚为我省去了很多麻烦!感谢您的回复!+1为“匿名闭包创建稳定变量范围”答案!您刚刚为我省去了很多麻烦!感谢您的回复!