我有这个:
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的值。但它不应该通过值,因为它是一个数字?我如何获得想要的结果?感谢
答案 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])} );
}