我是AS3的新手,并且无法弄清楚为什么这个循环不像“应该”那样表现。
for each (var s in [_set, _set.otherSet]) {
for each (var f in [s.frame_top_mc, s.frame_bottom_mc]) {
f.addEventListener(MouseEvent.CLICK, function( ):void {
_score[f.category] += 1;
madeSelection(f);
});
}
}
如何为每个匿名函数提供对f
所代表的每个对象的引用,而不是每次对f
的简单引用?
具体来说,为什么匿名函数的每个副本都绑定到f
的单个引用?怎么(我应该说明原因)AS3在这方面与JavaScript有什么不同?
答案 0 :(得分:2)
它必须是这样的:
for each (var s in [_set, _set.otherSet]) {
for each (var f in [s.frame_top_mc, s.frame_bottom_mc]) {
f.addEventListener(MouseEvent.CLICK, function( e:MouseEvent ):void {
_score[e.currentTarget.category] += 1;
madeSelection(e.currentTarget);
});
}
}
问题是你的闭包是关闭循环变量 f 本身,而不是每个东西都被用来在循环中引用。循环完成后, f 将作为对循环列表中最后一项内容的引用。创建闭包时, f 不会被取消引用,但是当它被执行时。