2014-05-18 2 views
1

그래서 여기에 약간의 문제가 있습니다. 더 간단하게 만들기 위해 위의 코드에서 가짜 변수 이름을 사용하겠습니다. 그러나 특정 조건에 의해 한 번만 호출되는 기능을 지정하는 것은 중요하지 않습니다. 이 함수는 Function 자체 인 변수를 만듭니다. 그런 다음이 함수 변수의 timer eventListener를 호출하여 '루프'에서 호출합니다. 그것은 그 부분을 위해 작동합니다. 그런데이 이벤트 리스너를 제거하려고하지만이 타이머 함수에서 함수의 변수 (인수로 보낸 변수)를 인식하지 못합니다. 그것은 null을 보여 주며 그것은 eventListener를 제거 할 수없고 함수가 영원히 계속 호출된다는 것을 의미합니다. 어떤 해결책?플래시 AS3. EventListener 제거 문제

P. 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; 
     } 
    }; 
} 
+1

흥미 롭다면 실제로 복사 할 것이라고 생각했기 때문에 실제로 복사하고 붙여 넣어야했습니다. 어쩌면 누군가가 설명 할 수 있습니다. 그러나 이것이 작동하지 않는다면,이 방법으로 그것을 만들 필요가 무엇입니까? 함수가 반환되지 않는다고 코드를 변경할 수는 없습니까? 내가 설명에 궁금해하기 때문에 이것을 포기한다. – Fygo

답변

2

나는 그것이 this과 관련이 있다고 생각합니다. 당신은 당신이 [object YourClass]을 얻을 것 trace (this);하지만 당신이 그렇게 같은 함수 내에서 그렇게 할 때 경우

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]를 얻을 내가 가지고 느낌 클래스 객체는 그 범위에 더 이상 존재하지 않는다. 그들이 생성 된 함수 내 사용할 수 없습니다로

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; 
     } 
    }; 
} 
0

당신은 기성품 기능 코드를 반환해야, 그 refX, refY, refFunction에 대한 참조없이 : 나는 그것이 this 치우는에 의해 실행하고 명시 적으로 변수를 선언 얻을 관리 . 동적으로 생성 된 리스너를 제거하는 것을 쉽게 아니지만

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

은 (이미 변수 myFunction에 저장하기가 코드가) 그렇게 먼저 어딘가에 기능을 저장해야,주의하십시오.