Как уже было предложено, вы можете удалить замыкание из цепочки слушателей изнутри самого замыкания. Это делается с помощью arguments.callee:
myDispatcher.addEventListener("click", function(event:Event):void
{
IEventDispatcher(event.target).removeEventListener(event.type, arguments.callee);
// Whatever else needs doing goes here
});
Это эффективно превратит замыкание в одноразового прослушивателя события, просто отсоединив себя после срабатывания события. Хотя это синтаксически многословно, это невероятно полезный метод для тех многих событий, которые действительно запускаются только один раз (или вас интересует только один раз), например, «creationComplete» во Flex. Я использую это все время при загрузке данных, так как думаю, что встроенный код обратного вызова облегчает понимание. Это похоже на сокрытие асинхронности:
myLoader.addEventListener("complete", function(event:Event):void
{
/* Even though the load is asynchronous, having the callback code inline
* like this instead of scattered around makes it easier to understand,
* in my opinion. */
});
Однако, если вы хотите прослушать событие несколько раз, это не будет очень эффективным по очевидным причинам. В этом случае вам нужно где-то хранить ссылку на замыкание. Методы являются объектами, как и все остальное в ActionScript, и их можно передавать. Таким образом, мы можем изменить наш код так:
var closure:Function;
myDispatcher.addEventListener("click", function(event:Event):void
{
closure = arguments.callee;
// Whatever else needs doing goes here
});
Когда вам нужно удалить прослушиватель событий, используйте ссылку 'closure', например, так:
myDispatcher.removeEventListener("click", closure);
Очевидно, что это абстрактный пример, но использование таких замыканий может быть довольно полезным. Однако у них есть недостатки, например, они менее эффективны, чем именованные методы. Другим недостатком является тот факт, что вам действительно нужно хранить ссылку на закрытие, если оно вам когда-нибудь понадобится. Затем необходимо позаботиться о сохранении целостности этой ссылки, как и с любой другой переменной.
Таким образом, хотя разный синтаксис может иметь свое применение, это не всегда лучшее решение. Это яблоки и апельсины.