Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Замыкание (http://www.flasher.ru/forum/showthread.php?t=177415)

rs7 31.03.2012 14:00

Замыкание
 
Напишите рабочий пример замыкания в as3. Что-то не получается у меня воспроизвести эту штуку :)

Wolsh 31.03.2012 15:49

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        var arr:Array = [1, 2, 3];
                        var x:int = 10;
                        var arr2:Array = calc(arr, function(elem:int):int { return x * elem } );
                        trace(arr2); // 10, 20, 30
                }
 
                private function calc(arr:Array, method:Function):Array
                {
                        var array:Array = [];
                        for (var index:int = 0; index < arr.length; index++ )
                        {
                                array.push(method(arr[index]));
                        }
                        return array;
                }
        }
}

Добавлено через 2 минуты
хотя.. инты всеравно передаются не по ссылке, надо помудрёней пример придумать.

КорДум 31.03.2012 15:54

Дык
Код AS3:

btn.addEventListener(MouseEvent.CLICK, function(event:MouseEvent) { trace(event.target); } );


Wolsh 31.03.2012 16:05

Во.
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
                private var _arrLength:int = 3;
 
                public function Main():void
                {
                        var arr:Array = [1, 2, 3];
                        calc(function(modifier:int, index:int):void { arr[index] *= modifier } );
                        trace(arr); // 10, 20, 30
                }
 
                private function calc(method:Function):void
                {
                        var mod:int = 10;
                        for (var i:int = 0; i < _arrLength; i++ )
                        {
                                method(mod, i);
                        }
                }
        }
}

Добавлено через 3 минуты
КорДум, анонимная функция еще не closure. Фишка в сохранении контекста, то есть в моем примере анонимка, исполняясь в calc, "помнит" ссылку на arr. Это и есть замыкание.

Silicium 31.03.2012 16:20

а, кстати, что плохого в замыкании кроме того, что она анонимка?

strangedk 31.03.2012 21:22

Недавно экспериментировал с замыканиями и scope'ами, и в итоге накрутил вот такое:

Код AS3:

function summ(a:Number):Function {
        return function(b:Number):Function {
                return function(c:Number):Function {
                        return function(d:Number):String {
                                return (a+b+c+d).toFixed();
                        }
                }
        }
}
 
var total:String = summ(1)(2)(3)(4);
 
trace(total);


Silicium 31.03.2012 23:23

жуть какая)


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

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