Actionscript 3 匿名函数中变量的奇怪行为?
有人能解释为什么下面代码的跟踪结果是“5,5,5,5,5”而不是“1,2,3,4,5”,以及如何使匿名函数引用数组中的collect元素吗?(在本例中,“var item”应该引用列表[0]、[1]、[2]、[3]、[4])Actionscript 3 匿名函数中变量的奇怪行为?,actionscript-3,flash,function,variables,anonymous-function,Actionscript 3,Flash,Function,Variables,Anonymous Function,有人能解释为什么下面代码的跟踪结果是“5,5,5,5,5”而不是“1,2,3,4,5”,以及如何使匿名函数引用数组中的collect元素吗?(在本例中,“var item”应该引用列表[0]、[1]、[2]、[3]、[4]) 这是两件事的结果: AS3中的函数级作用域:中的变量声明(列表中的var项:int)相当于在函数的开头(在您的示例中,在代码的开头)声明一个var项:int 匿名函数是闭包,它不仅包含指定的代码trace(item),还包含运行该代码的环境。具体来说,由代码创建的每个匿名函
这是两件事的结果:
中的变量声明(列表中的var项:int)
相当于在函数的开头(在您的示例中,在代码的开头)声明一个var项:int
trace(item)
,还包含运行该代码的环境。具体来说,由代码创建的每个匿名函数都知道它应该使用项
变量(在函数范围中声明)进行打印(通过跟踪()
)因此,
项
被分配给列表
的所有元素,然后保留最后一个值(即5)。它存在(不超出范围),当这些匿名函数启动时,它们中的每一个都会查看相同的项并打印相同的值。代码的问题在于创建了一个闭包,以后可以访问。
对于您想要做的事情,您需要创建多个闭包,以后可以访问这些闭包
var list:Array=[1,2,3,4,5];
var funcs:Array=[];
var closure_factory = function(index) {
return function() { trace(index); };
};
for each(var item:int in list){
funcs.push(closure_factory(item));
}
for each(var func:Function in funcs){
func();
}
闭包每个func的项都是共享的,并显示最后一个项的值您的是JavaScript中几乎完全不好的示例:Douglas Crockford的好部分:)尝试以下方法来修复它:var helper:Function=Function(i:int):Function{return Function():void{trace(i);}
然后更改为funcs.push(helper(item))代码>它所做的是将项的当前循环值传递给由创建的新闭包helper@Lukasz“Severiaan”Grela仍然是这个页面上最有价值的信息。谢谢你的回复,这个答案让我明白了我的代码有什么问题。
var list:Array=[1,2,3,4,5];
var funcs:Array=[];
var closure_factory = function(index) {
return function() { trace(index); };
};
for each(var item:int in list){
funcs.push(closure_factory(item));
}
for each(var func:Function in funcs){
func();
}