2014-05-18 97 views
1

所以我在這裏遇到了一些問題。我將在我將顯示的代碼中使用假變量名稱,以使其更簡單。但是,我做了一個函數,這個函數被一些不重要的條件調用。該函數創建一個函數本身的變量。然後,我爲這個函數變量調用一個定時器eventListener在一個'循環'中調用它。它適用於那部分。但是,我想刪除這個事件監聽器,但它不能識別該定時器函數中的函數變量(作爲參數發送)。它顯示爲空,它意味着我無法刪除eventListener,並且該函數一直被永遠調用。任何解決方案Flash AS3。刪除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; 
     } 
    }; 
} 
+1

有趣的是,我不得不復制粘貼它,因爲我認爲它確實會起作用。也許有人可以解釋它。但是,如果這不起作用,那麼以這種方式制定它的需求是什麼?你不能只是改變你的代碼,一個函數不返回?贊成這一點,因爲我也很好奇這個解釋。 – Fygo

回答

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; 
     } 
    }; 
} 
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)。