Форум 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)

dashaaa 29.10.2008 12:47

Функции внутри функций - почему это зло?
 
Добрый день,
извините за назойливость, но мне необходимо понять - почему плохо создавать функции внутри функций?
И как правильно организовать следующий код?
Код:

public function loadImg():Void {
        var mclLoader:MovieClipLoader = new MovieClipLoader();
        var oLoadListener:Object = new Object();
        mclLoader.addListener(oLoadListener);

        function onLoadError(mcTarget:MovieClip, sErrorCode:String):Void {}
}

Поиск довольно внятно ответил мне, что это "*****код", но хочется обоснования...:wacko:

iNils 29.10.2008 13:08

Код:

class имя класса {
        var mclLoader:MovieClipLoader = new MovieClipLoader ();

        public function конструктор класса () {
                mclLoader.addListener(this);
        }

        public function loadImg():Void {

        }

        private function onLoadError (mcTarget:MovieClip, sErrorCode:String):Void {
        }
}


etc 29.10.2008 13:13

dashaaa, ну во-первых, приведенный вами код не будет работать, просто потому что onLoadError не принадлежит объекту oLoadListener. А вложенные функции плохи тем, что во первых, плывет область видимости и начинаются проблемы с обращением к различным свойствам и объектам, во вторых, вместо того, что создать метод один раз в памяти, он постоянно пересоздается новый.

Wolsh 29.10.2008 13:16

Дело в том, что функция просто выполняется при вызове, и выполнившись, возвращает результат или меняет чтото вне себя. После того, как она выполнилась, все ее внутренние переменные больше недоступны, точнее их уже нет. Все эти переменные - mclLoader, oLoadListener, и функция onLoadError() существуют лишь до тех пор, пока выполняется loadImg(), потому что это ее внутренние переменные. Они как пассажиры пролетающего вагона - могут разговаривать друг с другом, но Вы, на полустаночке), ни словом с ними не перекинетесь. Пролетая мимо, они Вам могут крикнуть "загрузи картинку и отдай Васе на пятом сиденье", но пока Вы сбегаете за картинкой - ни Васи, ни сиденья.
(из моего поста могло создаться впечатление, что дело во времени, но на самом деле конечно в областях видимости - т.е. нормальная организация подразумевает, что Вася стоит с Вами на полустаночке. Т.е. функция не должна быть внутри другой функции)

dashaaa 29.10.2008 14:03

Цитата:

Код:

class имя класса {
        var mclLoader:MovieClipLoader = new MovieClipLoader ();

        public function конструктор класса () {
                mclLoader.addListener(this);
        }

        public function loadImg():Void {

        }

        private function onLoadError (mcTarget:MovieClip, sErrorCode:String):Void {
        }
}


Compiler Error, line 2 - A class's instance variables may only be initialized to compile-time constant expressions.

Но вообще-то идея ясна, спасибо.

__etc, спасибо, с областью видимости уже столкнулась, и то, что метод пересоздаётся - это аргумент.
Wolsh, спасибо, понятно =)

Mnilionic 29.10.2008 20:42

создавайте экземпляр MovieClipLoader в конструкторе класса

chingachgoog 29.10.2008 21:28

Функция внутри функции - это нормальное явление, просто надо знать для чего это нужно.
То, что "поезд уходит" тоже не совсем верно:
Код:

function A(){
        var x="123"
        B()
        function B(){
                link=this
                this.x
        }
}
A()

trace(link.x)

А вообще посмотрите тему Битва гигантов..., там как раз ближе к концу объекты активации исследуются.

Mnilionic 29.10.2008 21:35

хы-хы
в делигаторе функция внутри функции, но там правда ссылка на неё живая

Division 29.10.2008 21:47

Цитата:

Функция внутри функции - это нормальное явление, просто надо знать для чего это нужно.
А для чего нужно, если не секрет? Мне вообще кажется что это довольно удобно в некоторых случаях. Например, если большая функци выполняет много однотипных действий, их можно вынести во вложенную функцию. ИМХО.

iNils 29.10.2008 22:54

Цитата:

А для чего нужно, если не секрет?
Только для реализации Delegate. Других оправданных примеров использования я не вижу.
Цитата:

Мне вообще кажется что это довольно удобно в некоторых случаях. Например, если большая функци выполняет много однотипных действий, их можно вынести во вложенную функцию.
Выше было сказано, что это приводит к неоправданному расходу памяти. Делайте приватный метод и выносите в него.


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

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