DIGG IT!
4
Comments
Published
Friday, January 15, 2010
at
3:23 PM
.
Method closures allow you to bind variables into the scope of an anonymous function. Watch the value of local variable 'i' in the example below in the returned anonymous function. It is a bit twisted but results show the scope of local variable 'i' is bound in the returned function from newCounter.
package
{
import flash.display.Sprite;
public class ClosureAS3 extends Sprite
{
public function ClosureAS3()
{
init() //giv-em-the-jit :)
}
public function init():void
{
//create a counter
var counter1:Function = newCounter();
trace( counter1() ); //1
trace( counter1() ); //2
trace( counter1() ); //3
var counter2:Function = newCounter();
trace( counter2() ); //1
trace( counter2() ); //2
trace( counter1() ); //4 --> scope of i is still with counter1...cool! :)
}
public function newCounter():Function
{
var i:int = 0; //variable i gets bound into returned anonymous function via method Closure
return function():int
{
//i is available to the scope of the anonymous function
i=i+1;
return i;
}
}
}
}
Ted on Twitter - @AdobeTed
Ted on Adobe Groups
Ted on LinkedIn
Ted on Facebook
Ted at Adobe
Scary good, or scary bad?
you're invoking the function at assignment time already which is not necessary (i.e. you do not need to add parenthesis when you assign the function reference)
// just take the reference without invoking it
var counter1:Function = newCounter;
How do you remove the closure (and the variable it refers to) from memory?
Dirk,
Everytime newCounter is called a new anonymous function is created and returned. As the function is returned the local variable i becomes bound creating the closure. Although i was a local variable it is now scoped within the new function and isn't local or global. If I returned a reference to newCounter directly, the closure will not get created.
I checked with an engineer on player team who works on the VM in regards to closures and its effects on memory and reference. Provided that the object bound into the closure has no references to other objects, the closure and all variables will garbage collect when all references to the function are destroyed.