The reason I suggested an anonymous function was that it gave you the opportunity to tie additional arguments to the function without the callee being aware of it -- which was the original poster's question, how can you pass additional arguments into a function that'll be called by an event handler. This was my initial thought on how to do this (since functions are objects).
If performance was a problem, I guess you could just create a wrapper object with a single method. You'd create a new instance of that wrapper object for each customized invocation of the function you wanted. Though that feels a lot heavier, since the function that's bound to the event handler is a method I guess its easier on the VM. Troy. On 2/15/07, Francis Cheng <[EMAIL PROTECTED]> wrote:
Another reason the anonymous function technique is not recommended for event handlers is that the 'this' keyword in an anonymous function refers to the global object whereas if you use a method, the 'this' keyword refers to that method's associated object. Francis ------------------------------ *From:* [email protected] [mailto:[EMAIL PROTECTED] *On Behalf Of *Gordon Smith *Sent:* Thursday, February 15, 2007 3:45 PM *To:* [email protected] *Subject:* RE: [flexcoders] Re: addEventListener and additional arguments? The expense is in making an "activation frame" (or something like that) for anonymous functions. I don't have numbers on how much worse the performance is. It probably doesn't make a significant difference for occasional events. Nevertheless, when we write framework classes, we almost always use methods for event handlers. Is there a reason that you prefer to use an anonymous function? - Gordon ------------------------------ *From:* [email protected] [mailto:[EMAIL PROTECTED] *On Behalf Of *Troy Gilbert *Sent:* Thursday, February 15, 2007 11:59 AM *To:* [email protected] *Subject:* Re: [flexcoders] Re: addEventListener and additional arguments? How much worse is the performance? Are we talking on the order of a dozen or so extra instructions or orders of magnitude more? And I guess it would depend on the event being handled, right? Sure, it may be cost-prohibitive for onEnterFrame, but what something like onMouseDown or even onCreationComplete? [Note: I'm using the old style event names as I find it more readable when discussing them.] And what's the expensive part? The binding of the anonymous function object rather than a method, or executing the function object rather than a method? I would assume the latter, since the former should be identical (they're both objects, right?). And doesn't an event listener just store a collection of Function objects? So it's already dispatching through a function object, which makes me think that the overhead is in managing closure, etc? Troy. On 2/15/07, *Gordon Smith* <[EMAIL PROTECTED]> wrote: Using anonymous functions as event handlers isn't recommended, as they have worse performance than using methods. - Gordon ------------------------------ *From:* [email protected] [mailto:[EMAIL PROTECTED] *On Behalf Of *Troy Gilbert *Sent:* Wednesday, February 14, 2007 9:44 PM *To:* [email protected] *Subject:* Re: [flexcoders] Re: addEventListener and additional arguments? Remember, functions are objects to (so you can treat them like fancy functors in C++): var functor:Function = function(arg:String):String { return arg + functor["param"]; } functor["param"] = "dolly"; trace(functor("hello"); // outputs "hellodolly" or, for events: var myEventHandler:Function = function(event:MouseEvent):void { trace(myEventHandler["extraData"]); } myEventHandler["extraData"] = "hellodolly"; this.stage.addEventListener(MouseEvent.CLICK , myEventHandler); // when you click on the stage, you'll get the debug message "hellodolly" This'll give you what you're looking for. Not sure what the best way to copy a "functor" object would be... but you could definitely just create a new, separately named Function object for each form item that wraps your function, passing in the the "extraData". Troy. On 2/14/07, *Gordon Smith* < [EMAIL PROTECTED]> wrote: Here's an example of what I meant: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml "> <mx:Script> <![CDATA[ private var foo:int = 7; private function clickHandler(event:MouseEvent):void { trace(foo); } ]]> </mx:Script> <mx:Button click="clickHandler(event)"/> </mx:Application> Note that the Button's clickHandler() can access the instance variable 'foo', despite the fact that 'foo' isn't passed to clickHandler() and 'foo' isn't a property of event.target, which is the Button. The reason that clickHandler() can access 'foo' is that when clickHandler() executes, 'this' is the Application (or whatever component you're writing). - Gordon ------------------------------ *From:* [email protected] [mailto: flexcoders@ yahoogroups.com] *On Behalf Of *darylgmyers *Sent:* Wednesday, February 14, 2007 7:42 AM *To:* [email protected] *Subject:* [flexcoders] Re: addEventListener and additional arguments? Gordon, I'm pretty new to Flex so I appologize for the additional question. Are you saying that I can add an instance property to the target so that it will be available in the event.target? What I'm actually doing is creating a set of form fields on the fly using action script. Some of these fields may be number types with a precision value. My formatting is done with an event listener which I need to be able to pass the precision value. --- In [email protected] <flexcoders%40yahoogroups.com>, "Gordon Smith" <[EMAIL PROTECTED]> wrote: > > There should be no need to pass additional arguments to the event > handler method, because -- assuming it is indeed a method of a class -- > it can access all the instance properties of that class. So just set an > instance property. > > - Gordon > > ________________________________ > > From: [email protected] <flexcoders%40yahoogroups.com> [mailto: [email protected] <flexcoders%40yahoogroups.com>] On > Behalf Of darylgmyers > Sent: Tuesday, February 13, 2007 1:42 PM > To: [email protected] <flexcoders%40yahoogroups.com> > Subject: [flexcoders] addEventListener and additional arguments? > > > > Is there a way to use the addEventListener method and pass additional > arguments along with the event? I have a form where I must create the > form objects dynamically so I need to use addEventListener for > formatting, etc. I can not use inline mxml to add the listeners. >

