我有一个小循环
var a:Array = [{name:Test1},{name:Test2},{name:Test3},{name:Test4}]
var b:GenericButton; //A pretty basic button component
for(var i:int = 0; i < a.length; i++){
b = new GenericButton(a[i].name, function():void { trace(i) });
this.addChild(b);
}
提供给 GenericButton 的函数在按下按钮时执行。
我遇到的问题是,无论我按什么按钮,总是输出值 4(数组的长度)。
我如何确保在按下第一个按钮时跟踪 0,在按下第二个按钮时跟踪 1,等等?
最佳答案
好吧,你可以简单地做:
var f:* = function():void { trace(arguments.callee.index) };
f.index = i;
b = new GenericButton(a[i].name, f);
更好的是:
function createDelegate(obj:Object, func:Function):Function
{
var f:* = function ():* {
var thisArg:* = arguments.callee.thisArg;
var func:* = arguments.callee.func;
return func.apply(thisArg, arguments);
};
f.thisArg = obj;
f.func = func;
return f;
}
...
for (...) {
b = new GenericButton(a[i].name,
createDelegate({index: i}, function():void { trace(this.index) }));
}
在某些(大多数?)情况下,如果您创建一个单独的类并将 i
传递到构造函数中会更好。
关于actionscript-3 - AS3 闭包困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527731/