![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
|
|
|||||
|
Регистрация: Apr 2007
Сообщений: 29
|
etc, значит можно заносить в FAQ, там кроме "зло" ничего вразумительного про замыкания нет
А это, между прочим, самый простой способ. И так ли оно смертельно в данном случае? Если событие происходит крайне редко, мало того, для каждого экземпляра загрузчика единожды, чего ради городить свои классы? |
|
|||||
|
DnV, каждый раз при вызове такого метода (вы кстати путаете класс и метод) создается новый экземпляр объекта, который не удаляется (где-то на форуме было). К тому же это крайне не удобно в отладке и разработке. Да и что мешает создать нормальный обработчик?
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
Регистрация: Apr 2007
Сообщений: 29
|
TanaTiX, классы и методы я не путаю, нет
За ссылку к обсуждению на форуме этой проблемы буду благодарен. |
|
|||||
|
Регистрация: Apr 2007
Сообщений: 29
|
TanaTiX, спасибо. Поведение, о котором пишет BlooDHounD всё же предсказуемо. Да, сложнее дебажить. По поводу памяти, я не знаю как именно работает getSize, но даже если вложенная функция весит на пол килобайта больше, в ряде случаев это не важно. Сравнивать их тоже обычно не приходится. В общем, достаточно просто учитывать эти особенности и можно смело пользоваться. В ряде случаев (включая мой пример) проблем не будет.
|
|
|||||
|
Мне на вопрос "Дык иногда же очень удобно использовать анонимные функции" тимлид рассказал как он снизил потребление памяти в проекте с 800 до 200 MB повыпилив от туда анонимки.
Функция то сама может и не много весит - несколько килобайт, только вот она может захватить контекст, весящий десятки метров (например, если вы баловались внутри BitmapData-ми, а потом повесили ее как обработчик, да так она там и провисела пока флешплеер не закрыли) Последний раз редактировалось expl; 20.01.2012 в 13:34. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Цитата:
В общем, достаточно просто учитывать, что анонимы создают проблемы и не использовать их. Вообще не использовать. Забыть и все. Последний раз редактировалось iNils; 20.01.2012 в 13:55. |
|
|||||
|
Modus ponens
|
Давайте внесем немного ясности: замыкание - это не зло, уже хотябы потому, что оно неизбежно случается с любой функцией
Замыканием называют лексическое окружение конкретного экземпляра функции. Так, например у функции f из примера ниже замыкание содержит связанные переменные y и z, и свободную переменную x, группа переменных {x, y, z} называется замыканием. В некоторых, очень часто встречающихся в AS3 ситуациях в заыкание неявно добавляются еще 2 переменные - this и super.Замыкание - это теоретическая концепция, она не обязана быть явно выражена в коде (в реализации того или другого языка), но, как только в языке программирования есть функции, имеет смысл говорить о замыканиях. Теперь по-сути вопроса: использование анонимной функции в качестве слушателя. В AS3 - это плохая практика по причине плохой реализации анонимных функций и контекстных привязок для них. В чем это выражается: сначала о привязках, привязка в лексической среде подразумевает связывание значения с именем. Так, в примере выше значение 42 связано с именем y. Пока вы оперирует константами (числа - константы), то разницу вы не увидите, но, как только вы столкнетесь с необходимостью лексически связать сложную структуру с именем, у вас возникнут две принципиально разные возможности это сделать. Вы можете создавать структуру каждый раз как функция выполняется, а можете создать ее всего один раз. Последнее имеет смысл для функций, т.как типично, вы не захотите создавать одну и ту же функцию много раз. К сожалению, в AS3 нет возможности управлять типом связывания, и все связывания делаются динамически - это значит, что функция объявленная внутри другой функции всегда будет создана повторно, при повторном вызове внешней функции. Это, во-первых, естесственно, нееффективно (т.как вы создаете абсолютно никому не нужную копию, при том, что вполне могли бы использовать уже существующую), чревато, т.как даже если вам не нужно сравнивать функции, EventDispatcher это делает каждый раз, когда диспатчит событие и значительная часть его логики завязана на сравнении функций. Из практических соображений, нет никаких преимуществ в использовании вложенных функций, но, как уже было сказано, неудобства при отладке, да и просто форматирование кода... вобщем, кругом одни недостатки и никаких достоинств. Вот, поэтому, вложенными функциями и не пользуются.
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:46. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| anonimous function , вложенность |
|
|