sta*_*ats 2 closures actionscript-3
我有一个小循环
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);
}
Run Code Online (Sandbox Code Playgroud)
按下按钮时,将执行提供给GenericButton的功能.
我遇到的问题是,无论什么按钮我按下4的值(数组的长度)总是输出.
我如何确保在按下第一个按钮时跟踪0,在按下第二个按钮时跟踪等等?
好吧,你可以简单地做:
var f:* = function():void { trace(arguments.callee.index) };
f.index = i;
b = new GenericButton(a[i].name, f);
Run Code Online (Sandbox Code Playgroud)
更好的是:
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;
}
Run Code Online (Sandbox Code Playgroud)
...
for (...) {
b = new GenericButton(a[i].name,
createDelegate({index: i}, function():void { trace(this.index) }));
}
Run Code Online (Sandbox Code Playgroud)
在某些(大多数?)情况下,如果您创建一个单独的类并传递i给构造函数,那将会更好.