Использование более функционального стиля метода forEach в классе Array позволяет избежать этой проблемы.
Это уже упоминалось, но я остановлюсь на этом здесь.
imageList.forEach( function ( item:MovieClip, index:int, list:Array) {
// add your listener with closure here
})
Используя этот метод, функция, передаваемая в forEach, определяет новую область видимости на каждой итерации. теперь вы можете добавить замыкание внутри этой области видимости, и он будет помнить каждый экземпляр как вам нужно.
На связанной ноте:
Набирать эти 3 аргумента все время - боль, так что ...
Вы также можете сделать это менее / более безобразным с помощью функции адаптера:
// just give me the item please
imageList.forEach ( itrAdpt( function ( image: ImageData ) {
// add your listener with closure here
}))
// give me the item and it's index
imageList.forEach ( itrAdpt( function ( image: ImageData, index:int ) {
// add your listener with closure here
}))
// give me the item, index and total list length
imageList.forEach ( itrAdpt( function ( image: ImageData, index:int, length:int ) {
// add your listener with closure here
}))
где itrAdpt - это (возможно, глобальная) функция, определенная примерно так:
public function itrAdpt(f: Function): Function
{
var argAmount:int = f.length
if (argAmount == 0)
{
return function (element:*, index:int, colection:*):* {
return f(element)
}
}
else if (argAmount == 1)
{
return function (element:*, index:int, colection:*):* {
return f(element)
}
}
else if (argAmount == 2)
{
return function (element:*, index:int, colection:*):* {
return f(element, index)
}
}
else if (argAmount == 3)
{
return function (element:*, index:int, colection:*):* {
return f(element, index, colection.length)
}
}
else
{
throw new Error("Don't know what to do with "+argAmount+"arguments. Supplied function should have between 1-3 arguments")
}
}