Closures in ActionScript

Example: Closures in ActionScript

ActionScript supports anonymous functions, which can form closures. Anonymous functions are useful when you want to define a function inline without having to name it.

This function intSeq returns another function, which we define anonymously in the body of intSeq. The returned function closes over the variable i to form a closure.

package {
    import flash.display.Sprite;
    import flash.text.TextField;

    public class Main extends Sprite {
        public function Main() {
            var nextInt:Function = intSeq();
            addChild(createTextField(nextInt())); // 1
            addChild(createTextField(nextInt())); // 2
            addChild(createTextField(nextInt())); // 3

            var newInts:Function = intSeq();
            addChild(createTextField(newInts())); // 1
        }

        private function intSeq():Function {
            var i:int = 0;
            return function():int {
                i++;
                return i;
            };
        }

        private function createTextField(text:String):TextField {
            var textField:TextField = new TextField();
            textField.text = text;
            return textField;
        }
    }
}

We call intSeq, assigning the result (a function) to nextInt. This function value captures its own i value, which will be updated each time we call nextInt.

See the effect of the closure by calling nextInt a few times.

To confirm that the state is unique to that particular function, create and test a new one.

$ mxmlc Main.as && Main.swf
1
2
3
1

Now that we can utilize closures for stateful functions in ActionScript, let’s learn more about the language.