2011-06-17 54 views
1

我一直在編寫ActionScript(Haxe)中的一些東西,並且得到了這個非常具體的問題。ActionScript Haxe評估封閉循環中的引用變量

下面的代碼(僞:S):

var func:Array = new Array(256); 
(A) var i:Int = 0; 
for(;i<256;i++) { // OR // for(i in 0...256) { 
    func[i] = function() { trace(i); } 
} 

func[0](); 
func[127](); 
func[256](); 

上面的代碼輸出的(a):

256 
256 
256 

我想要的是(B):

0 
127 
256 

這不會發生,因爲ActionScript/Haxe將i的引用賦值給該函數,並且因爲我在循環結束時等於256函數得到評估,這就是爲什麼我得到(一)。

有沒有人知道一種方法來避免這種情況,並在(b)得到預期的結果?

感謝大家和你的迴應。

我想我找到了答案。如果你刪除標有(A)的行,它會起作用,如果你放棄它,它不會。我很確定你們都可以弄清楚爲什麼會發生這種情況。再次感謝!

+0

你能給我們提供關於你的用例的更多細節嗎?我完全不理解這一點......你正在創建相同功能的256個副本,但從不存儲任何值。 'i'被實例化一次,然後在每次迭代中被覆蓋。我是您創建的唯一變量(除了重複函數數組)。你可以存儲一個函數的結果嗎?但是重複地在數組中存儲相同的函數對我來說沒有任何意義。 –

+0

你能解釋一下嗎?這段代碼應該像你想要的那樣在HaXe中運行,除非你正在編譯爲AS3源代碼。是這樣嗎? – Waneck

回答

2

它不是neccessary使用回調,預期這應該工作(haXe的每個循環創建一個局部變量):

var func = []; 
for(i in 0...256) 
    func[i] = function() trace(i); 

func[0](); 
func[127](); 
2

你顯示的是期望的/期望的行爲。要保留的「我」,你必須使用「回調」的值:

/* not pseudo code ;) */ 

var func = []; 
for(i in 0...256) 
    func[i] = callback(function(v) trace(v), i); 

func[0](); 
func[127](); 
func[256](); 
+0

是真的,儘管在這種情況下回調並不是必需的,正如@hotpotato所說。 – back2dos