2011-09-27 73 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会给出一个体面的解决方案和解释。 –