我一直在編寫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)的行,它會起作用,如果你放棄它,它不會。我很確定你們都可以弄清楚爲什麼會發生這種情況。再次感謝!
你能給我們提供關於你的用例的更多細節嗎?我完全不理解這一點......你正在創建相同功能的256個副本,但從不存儲任何值。 'i'被實例化一次,然後在每次迭代中被覆蓋。我是您創建的唯一變量(除了重複函數數組)。你可以存儲一個函數的結果嗎?但是重複地在數組中存儲相同的函數對我來說沒有任何意義。 –
你能解釋一下嗎?這段代碼應該像你想要的那樣在HaXe中運行,除非你正在編譯爲AS3源代碼。是這樣嗎? – Waneck