Давайте внесем немного ясности: замыкание - это не зло, уже хотябы потому, что оно неизбежно случается с любой функцией :) Замыканием называют лексическое окружение конкретного экземпляра функции. Так, например у функции f из примера ниже замыкание содержит связанные переменные y и z, и свободную переменную x, группа переменных {x, y, z} называется замыканием. В некоторых, очень часто встречающихся в AS3 ситуациях в заыкание неявно добавляются еще 2 переменные - this и super.
Код AS3:
var x:int;
function f(z:int):int
{
var y:int = 42;
return y + x + z;
}
Замыкание - это теоретическая концепция, она не обязана быть явно выражена в коде (в реализации того или другого языка), но, как только в языке программирования есть функции, имеет смысл говорить о замыканиях.
Теперь по-сути вопроса: использование анонимной функции в качестве слушателя. В AS3 - это плохая практика по причине плохой реализации анонимных функций и контекстных привязок для них. В чем это выражается: сначала о привязках, привязка в лексической среде подразумевает связывание значения с именем. Так, в примере выше значение 42 связано с именем y. Пока вы оперирует константами (числа - константы), то разницу вы не увидите, но, как только вы столкнетесь с необходимостью лексически связать сложную структуру с именем, у вас возникнут две принципиально разные возможности это сделать. Вы можете создавать структуру каждый раз как функция выполняется, а можете создать ее всего один раз. Последнее имеет смысл для функций, т.как типично, вы не захотите создавать одну и ту же функцию много раз. К сожалению, в AS3 нет возможности управлять типом связывания, и все связывания делаются динамически - это значит, что функция объявленная внутри другой функции всегда будет создана повторно, при повторном вызове внешней функции. Это, во-первых, естесственно, нееффективно (т.как вы создаете абсолютно никому не нужную копию, при том, что вполне могли бы использовать уже существующую), чревато, т.как даже если вам не нужно сравнивать функции, EventDispatcher это делает каждый раз, когда диспатчит событие и значительная часть его логики завязана на сравнении функций.
Из практических соображений, нет никаких преимуществ в использовании вложенных функций, но, как уже было сказано, неудобства при отладке, да и просто форматирование кода... вобщем, кругом одни недостатки и никаких достоинств. Вот, поэтому, вложенными функциями и не пользуются.