- From: Jorge <jorge@jorgechamorro.com>
- Date: Wed, 29 Jun 2011 00:53:56 +0200
- To: Ian Hickson <ian@hixie.ch>
- Cc: Cameron McCormack <cam@mcc.id.au>, public-script-coord@w3.org
On 29/06/2011, at 00:23, Ian Hickson wrote: > On Mon, 27 Jun 2011, Cameron McCormack wrote: >> >> In Web IDL currently, if you write [Callback] on an interface and the >> interface consists of a single operation, then script can implement that >> interface either by using a Function object, or by providing an object >> with a property whose name is the identifier of the operation. > > I've always assumed that the latter was a side-effect of non-JS languages > needing something more complicated here than just a function reference: if > the old DOM specs had never targetted anything but JS, would we support > the non-function case? Consider setTimeout(), which only takes a function > (or a string, for legacy reaons). > > >> Olli gave a good example of why you might want to allow objects-with-a- >> property to be used as callback objects, which is so that you can >> encapsulate some state in that object. >> >> var handler = { >> _highlighted: false, >> handleEvent: function(evt) { >> this._highlighted = !this._highlighted; >> evt.target.style.color = this._highlighted ? "red" : "black"; >> } >> }; >> e.addEventListener("click", handler, false); > > (function () { > var highlighted = false; > e.addEventListener("click", function (event) { > highlighted = !highlighted; > event.target.style.color = highlighted ? "red" : "black"; > }, false); > })(); Or you can simply attach 'highlighted' to the listener: e.addEventListener("click", function ƒ (event) { ƒ.highlighted = !ƒ.highlighted; event.target.style.color = ƒ.highlighted ? "red" : "black"; }, false); because functions are objects too. -- Jorge.
Received on Tuesday, 28 June 2011 22:54:37 UTC