2011-09-27 69 views
1

我有這樣的:AS3沒有按數值傳遞數字,而是通過引用?

for (var i:int = 0; i < 3; i++) { 
    var newChoice:MainButton = new MainButton(function(){ 
    trace(this["func" + i])}); 
} 

public function func0 ... 
public function func1 ... 
public function func2 ... 

(點擊時,MainButton調用的參數的函數)

不過,我得到FUNC3,我以爲是做給它找到我的價值。但是它不應該通過價值傳遞,因爲它是一個數字?我如何得到想要的結果?謝謝

回答

4

你沒有傳遞任何東西,除了函數本身(它通過引用傳遞)。

發生了什麼事是,函數創建變量i周圍封閉,改變它的壽命。當匿名函數被調用,i仍然在原來的範圍,但在循環已經結束,在3

所以,封閉基本上保持i在函數的範圍後連原來離開i,宣告功能已經完成。

您不想關閉變量,而是想在創建函數時關閉變量的。你可以用一箇中間變量來實現這一點,它只能在關閉之前設置一次:

for (var i:int = 0; i < 3; i++) { 
    var j = i;  // New variable each time through the loop; closure will close over a different variable each time (that happens to have the same name) 
    var newChoice:MainButton = new MainButton(function(){ 
     trace(this["func" + j])}); 
} 
+0

哦,我明白了。任何想法如何使其工作? – apscience

+0

@gladoscc:是的,看到我的編輯(你是太快了我!):-) – Cameron

+0

被警告蓋可被垃圾收集地獄。閉包基本上是失去了範圍的對象,因爲這對於系統來說非常困難,但+1會給出一個體面的解決方案和解釋。 –