actionscript-3 - AS3 闭包困惑

标签 actionscript-3 closures

我有一个小循环

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/

相关文章:

apache-flex - 将字节转换为 kb、mb、gb 等的 ActionScript 代码

actionscript-3 - Flash/Flash Builder 中的图像限制?

sqlite - Flex SQLite显示SUM()结果

javascript - 有人可以解释一下 howtonode 中的函数包装习惯吗?

java - java中的高阶函数和闭包

actionscript-3 - 为每台计算机生成静态唯一 ID,而不将其存储在本地 ActionScript 中

java - ChannelBuffer readInt()/writeInt() 导致错误值

iOS Swift 如何访问在完成处理程序闭包中创建的数据——在闭包之外

Groovy 找到 cloure 中的最后一次迭代吗?

JavaScript - 如何了解 "closures"的用法?