AS3关闭混乱

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,在按下第二个按钮时跟踪等等?

Man*_*ish 6

好吧,你可以简单地做:

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给构造函数,那将会更好.