Flash AS3。删除EventListener时出现问题

时间:2014-05-18 23:58:14

标签: actionscript-3 flash function events

所以我在这里遇到了一些问题。我将在我将要展示的代码中使用伪变量名称以使其更简单。但是,我创建了一个函数,该函数被某些不重要的条件调用一次。此函数创建一个函数本身的变量。然后,我为这个函数变量调用一个timer eventListener来在一个循环中调用它。它适用于那部分。但是,我想删除这个事件监听器,但它不能识别该函数的变量(我作为参数发送)。它显示为null,这意味着我无法删除eventListener,并且该函数将永远被调用。有解决方案吗

P.S。 myTimer是一个随处可用的公共变量,我收到1010错误。

public function calledOnce(){
    this.myFunction = loopFunction( x, y, "function" );
    this.myTimer.addEventListener( TimerEvent.TIMER, this.myFunction );
}
public function loopFunction( refX, refY, refFunction ){
    return function( e: Event ){
        //Do something
        switch( refFunction ){
            case "function":
                this.myTimer.removeEventListener( TimerEvent.TIMER, this.myFunction );
                break;
        }
    };
}

2 个答案:

答案 0 :(得分:2)

我认为它与this有关。如果你trace (this);,你会得到[object YourClass],但是当你在函数内部这样做时会这样:

public function loopFunction( refX, refY, refFunction ){
    return function( e: Event ){
        trace (this);
        //Do something
        switch( refFunction ){
            case "function":
                myTimer.removeEventListener( TimerEvent.TIMER, myFunction );
                break;
        }
    };
}

您得到[global]而我感觉您的类对象已不再存在于该范围内。我设法通过删除this并明确声明变量来运行它:

private var myFunction:Function;
private var myTimer:Timer = new Timer (1000);

public function calledOnce(){
    myFunction = loopFunction( x, y, "function" );
    myTimer.addEventListener( TimerEvent.TIMER, this.myFunction );
}
public function loopFunction( refX, refY, refFunction ){
    return function( e: Event ){
        //Do something
        switch( refFunction ){
            case "function":
                myTimer.removeEventListener( TimerEvent.TIMER, myFunction );
                break;
        }
    };
}

答案 1 :(得分:0)

您需要返回现成的功能代码,而不引用那些refX, refY, refFunction,因为它们在生成的函数中不可用。

public function loopFunction( refX, refY, refFunction ){
    switch( refFunction ){
        case "function":
            return function( e: Event ){
                //Do something
                myTimer.removeEventListener( TimerEvent.TIMER, myFunction );
            }
        }
    }
}

请注意,删除动态生成的侦听器并不容易,为此,首先必须将函数存储在某处(您已经有代码将其存储在变量myFunction中)。