Re: whether [Callback=FunctionOnly] should be the default

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