Создание анонимных функций в цикле с не теми же аргументами

Я хочу сделать в цикле множество кнопок и добавить к ним некоторые события, но анонимные функции одинаковы. Я пишу пример кода:

for(var i:int=0;i<5;i++)
{
    var button:SimpleButton = new SimpleButton(...);
    ...
    button.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void
    {
        trace(i);
    });
}

...

И я хочу отсканировать 0,1,2,3.. от кнопок, а не 4,4,4,4.. Вы знаете, как я могу это сделать?

Ответ 1

Проблема, с которой вы сталкиваетесь, заключается в том, что ActionScript не поддерживает закрытие.

Другими словами, переменная i не копируется в ее собственный контекст для каждой функции. Все функции относятся к тому же экземпляру i.

Дополнительная информация здесь: http://flex.sys-con.com/node/309329

Для этого вам понадобится функция, которая генерирует функцию:

public function makeFunction(i:int):Function {
    return function(event:MouseEvent):void { trace(i); }
}

Теперь вы создаете новые экземпляры функции со своим контекстом:

button.addEventListener(MouseEvent.CLICK, makeFunction(i));