Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Функции внутри функций - почему это зло? (http://www.flasher.ru/forum/showthread.php?t=117508)

chingachgoog 28.11.2008 13:51

А по-моему, если что и называть пренебрежительно "костылем", то как раз сам Delegate.

etc 28.11.2008 14:03

И то и другое костыль, но self-ссылки — костыль в несколько раз больше, и не один.

iNils 28.11.2008 14:16

Цитата:

Сообщение от __etc (Сообщение 780279)
И то и другое костыль, но self-ссылки — костыль в несколько раз больше, и не один.

Абсолютно согласен. Преимущество делагата в том, что мы не меняем область видимости this в любом месте класса.

faust.d503 28.11.2008 14:22

Цитата:

Да, но тогда анонимная функция с большой вероятностью останется жить, потому что есть self-ссылка, используемая внутри.
self объявлено внутри конструктора, анонимная функция существует там же. Как они остануться жить после выполнения кода констуктора мне с трудом понятно.
На self ссылка после выполнения конструктора убивается, остается ссылка внутри безымянной функции, на которую ссылка отсутствует, по идее должна убиться.
Как и что убивается при использования Delegate мне неизвестно, если известно вам, поясните пожалуйста.
А вообще рассуждения "с большей вероятностью" чистая демагогия.

iNils 28.11.2008 14:35

Цитата:

Сообщение от faust.d503 (Сообщение 780287)
self объявлено внутри конструктора, анонимная функция существует там же. Как они остануться жить после выполнения кода констуктора мне с трудом понятно.
На self ссылка после выполнения конструктора убивается, остается ссылка внутри безымянной функции, на которую ссылка отсутствует, по идее должна убиться.

Все поубивались после конструктора. И куда же тогда придет сообщении о загрузке?

chingachgoog 28.11.2008 16:11

А что вообще делегат делает? Возвращает функцию оболочку с нужной функцией вызова apply:
Код:

class Room {
        public function Room() {
                xmlDoc = new XML();
                xmlDoc.onLoad = function (){                   
                        return onLoadXML.apply(this, arguments);
                }
        }
        private function onLoadXML (success){}
}

По-любому генерится лишняя функция.

etc 28.11.2008 16:16

Цитата:

Сообщение от chingachgoog (Сообщение 780310)
Код:

                        return onLoadXML.apply(this, arguments);

Ага, только в этом коде область видимости не изменится.

Цитата:

Сообщение от chingachgoog (Сообщение 780310)
По-любому генерится лишняя функция.

Так она генерится в обоих костылях.

chingachgoog 28.11.2008 17:29

Цитата:

Сообщение от __etc (Сообщение 780311)
Ага, только в этом коде область видимости не изменится.

Да, это просто схема работы делегата. (код нерабочий, если кто не понял. Чтобы сделать его рабочим надо добавить ссылку на функцию onLoadXML. Например, так: xmlDoc.onLoadXML=onLoadXML)
Но суть в создании лишней функции-оболочки.

etc 28.11.2008 19:18

Цитата:

Сообщение от chingachgoog (Сообщение 780342)
Чтобы сделать его рабочим надо добавить ссылку на функцию onLoadXML. Например, так: xmlDoc.onLoadXML=onLoadXML)

Опять же, this внутри onLoadXML будет ссылаться на xmlDoc, а не на экземпляр Room. Снова область видимости будет неправильной.

chingachgoog 28.11.2008 19:38

Цитата:

Сообщение от __etc (Сообщение 780371)
Опять же, this внутри onLoadXML будет ссылаться на xmlDoc, а не на экземпляр Room. Снова область видимости будет неправильной.

Наоборот, правильной. Вместо вымученной делегатом.
Сразу видно, что обработчик onLoad принадлежит объекту xmlDoc и соответственно this внутри обработчика принадлежит xmlDoc.

Код без делегатов более понятный и логичный. Не зря же делегаты - пользовательский класс, а не встроенный.


Часовой пояс GMT +4, время: 17:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.