AS3没有按值传递,而是通过引用?

时间:2011-09-27 04:33:42

标签: actionscript-3

我有这个:

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,我认为这是找到i的值。但它不应该通过值,因为它是一个数字?我如何获得想要的结果?感谢

1 个答案:

答案 0 :(得分:4)

除了函数本身(通过引用传递)之外,你没有传递任何东西。

正在发生的是该函数在变量i周围创建一个闭包,从而改变其生命周期。调用匿名函数时,i仍处于其原始范围内,但循环已完成,i保持为3。

因此,即使在原始的声明函数完成之后,闭包实际上也将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])} );
}