2014-01-08 61 views
2

循環看看下面的代碼:事件監聽以及在AS3

import flash.display.MovieClip; 

    var q:MovieClip; 

    for(var i=0;i<10;i++) 
    { 
     q=new MovieClip(); 
     q.addEventListener(Event.ADDED_TO_STAGE,function(e){trace("<<<<>"+i)}); 
     q.addEventListener(Event.ENTER_FRAME,function(e){trace(">"+i)}); 
    addChild(q); 

     } 

輸出將是:

<<<<>0 
<<<<>1 
<<<<>2 
<<<<>3 
<<<<>4 
<<<<>5 
<<<<>6 
<<<<>7 
<<<<>8 
<<<<>9 
>10 
>10 
>10 
>10 
>10 
>10 
>10 
>10 
>10 

現在,在這裏可以清楚地看到的是,雖然Event.ADDED_TO_STAGE是正確註冊, Event.ENTER_FRAME不是,只註冊到最後一個值。

現在這裏變得複雜的時候,採取以下代碼:

import flash.display.MovieClip; 

var q:MovieClip; 

for(var i=0;i<10;i++) 
{ 
    q=new MovieClip(); 
    q.name="q_"+i; 
    q.addEventListener(Event.ADDED_TO_STAGE,function(e){trace("<<<<>"+i)}); 
    q.addEventListener(Event.ENTER_FRAME,function(e){trace(">"+e.target.name)}); 
addChild(q); 

    } 

輸出將是:

<<<<>0 
<<<<>1 
<<<<>2 
<<<<>3 
<<<<>4 
<<<<>5 
<<<<>6 
<<<<>7 
<<<<>8 
<<<<>9 
>q_0 
>q_1 
>q_2 
>q_3 
>q_4 
>q_5 
>q_6 
>q_7 
>q_8 
>q_9 

所以得出的結論是,事件被正確註冊,而是以一種不可思議的方式annonymous函數只接收來自i的最後一個值。

有誰知道爲什麼會發生這種情況?
如果這樣做,請分享,但不要回答如下:'嗯,我是首先計算的,很明顯,事件是在'之後註冊的。我想知道,如果有人有大約原因的更多見解和反響


編輯: 在新的答案光我所編輯的問題,因爲我已經意識到,它並沒有「打點」 確定給這個代碼:

for(var i=0;i<10;i++) 
{ 
    var q:MovieClip; 
    q=new MovieClip(); 
    var dummy:int; 
    dummy = 6+i; 
    q.addEventListener(Event.ENTER_FRAME,function(e){trace(dummy);}); 
    addChild(q); 

    } 

虛設被創建爲新的變種,因此在每次迭代時在循環內一個新的指針。所以通常情況下,函數內的啞元應該是不同的。仍然是同一個假人。

現在,經過更多的測試,我已經意識到,在的情況下,「爲{VAR X}」編譯器使用var關鍵字只有一次,所以基本上它改變了像「變種X;爲{}」


回答

3

i當函數被調用時評估,而不是當它被宣佈。 ADDED_TO_STAGE監聽器在循環中被調用,因爲對象被添加到循環中的舞臺上。 ENTER_FRAME監聽器在下次輸入幀時被調用,這將在當前幀中的所有代碼執行完畢後調用。此時i將爲10,因爲循環已完成。

這裏有一個簡單的例子:

var i:int = 0; 

function f() { 
    trace(i); 
} 

f(); // output: 0 
i = 2; 
f(); // output: 2 

在你的第二個例子,在循環中創建的名字,所以我是在循環內部評估,你會得到你的預期輸出。

+0

我編輯了我的答案。 – bwroga

+0

感謝您的回答:) –

2

花了我一段時間找出來。

該函數在事件發生時被調用。由於該函數在你的循環內部,所以在那裏被調用。

在添加到舞臺事件時,會在您的動畫片段添加時調用它。由於這發生在同一次迭代中,我的值是正確的。

循環完成後,enterframe開始發生。當函數被調用時,i的值爲10.因此,您總是得到10.

在第二個示例中,您不使用函數中的i值。 i的值在每次迭代時都在名稱中解析出來,所以在名稱中,當它在循環中解析時,會得到i的值。

+0

感謝您的回答:)。兩個答案確實如此,很難選擇最好的一個:P –

+0

因爲bwroga早些時候你可以選擇他:) –