2011-10-22 44 views
1

爲什麼不是這個工作,因爲我認爲這多少:傳遞局部變量裝載機匿名處理函數

var i:int=-1; 
for each(obj in myData) 
{ 
    i++; 
    var loader:Loader=new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(event:Event) 
    { 
     trace(i); 
    }); 
} 

有在myData的3個對象,並跟蹤聲明的樣子:

2 
2 
2 

代替:

0 
1 
2 

如果我添加i到陣列(像myArr.push(i))它將有3種元素,0,1和2

任何想法? 謝謝。

回答

1

首先讓我告訴你爲什麼它不能像你期望的那樣工作。 發生的事情是,for循環遍歷元素,並創建所有加載器,遞增i,但Event.COMPLETE稍後會發生,其中i已經在值2,所以這就是爲什麼您會得到該輸出。

由於wvxvw建議,你需要更多的數據結構是這樣的:

class MyLoader { 

    private var i: int; 
    private var loader: Loader; 

    function MyLoader(i:int) { 
     this.i = i; 

     loader = new Loader(); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded); 
    } 

    function onLoaded(event:Event) 
    { 
     trace(i); 
    } 
} 

而且你會在你的循環使用它:

var i:int = 0; 
for each(obj in myData) { 
    var loader:MyLoader=new MyLoader(i++);  
} 

當然,你需要向MyLoader添加更多內容,比如處理錯誤,並傳遞更有意義的東西以使所有內容都能正常工作。

+0

啊,我現在明白了。當所有字節被加載時,匿名函數會觸發。我認爲它一直是像JS那樣的一個「變量」,並且像聲明時那樣持有它。謝謝。 – Francisc

+1

您正在考慮JavaScript中的閉包.. ActionScript(即ECMAScript變體)也會這樣做,但是您必須將所有內容包裝到另一個函數中,並將'i'存儲在本地變量中,如下所示:http:// pastebin.com/iRdMZ0uc。 –

3

這就是你已經採取了...只是沒有做任何的那些你正在嘗試做的事情,它會沒事的一個非常不好的做法......在這裏使用匿名函數沒有點(這是從來沒有實際上在AS3中),沒有意義使用for-each,因爲你需要的是for(;;)。你使用動態類型沒有什麼好處(在AS3中動態類型沒有任何好處,反正也沒有好處)。而且,是的,關閉會捕捉上下文,上下文只有一個i,它的值是2,所以第一個跟蹤是你應該期望的。

,你應該做的事情 - 裝載機存儲一些數據結構和數據結構後接他們(當你需要的標識符)。並請,爲我們的用戶着想,負載無論你要加載順序 - 因爲如果你不這樣做,我們給你弄不處理IO錯誤...

+0

我認爲這是一種過度概括,你永遠不要需要AS3匿名函數。但是,如果您在理解函數式編程時遇到問題,您可能應該避免使用這些概念。有關如何正確進行函數式編程的更多信息,請查看http://www.developria.com/2010/12/functional-actionscript-part-1.html –

+0

謹慎使用和理解,匿名函數不會比任何其他語言功能。使用不關心和理解,他們可以像其他功能的人不普遍認識危險,如靜如災難性的(但可以在他們的方式 方式更糟) –

+0

謝謝。上面的代碼是一個簡化的例子來展示這個問題。這不是實際的代碼。我正在監聽IOErrors,我沒有每次都聲明var loader:Loader等等。上面的東西在JS中工作,並且很難理解爲什麼它不在這裏工作。 – Francisc

相關問題