arrow function syntax simplified

Jorge jorge at jorgechamorro.com
Mon Apr 2 16:22:09 PDT 2012


On Apr 2, 2012, at 9:47 PM, Brendan Eich wrote:
> Douglas Crockford wrote:
>> 
>> 
>> It seems I misunderstood what we were agreeing to. I think the (this...) form is critically important, and the immutability thing as well.
> 
> (...)
> 
> I agree that leading |this| could be important for dynamic non-method use-cases, but those are relatively rare (let's not discount JQuery, but again, it could use long functions and survive). We could put leading-this-parameterization on the agenda for May, but we'll have to be careful not to lose consensus on arrows.

I was chatting this evening with a friend about this (ruby) thing:

class Numeric
  (Math.methods - Module.methods - ["hypot", "ldexp"]).each do |method|
    define_method method do
      Math.send method, self
    end
  end
end


And I showed him how one could do that easily in JavaScript:

Object.getOwnPropertyNames(Math).forEach(function (key) {
  if (typeof Math[key] === 'function') {
    Number.prototype[key]= function () {
      return Math[key](this);
    };
  }
});


Then I thought, let's see how would that look like with arrows ?


Object.getOwnPropertyNames(Math).forEach((key) => {
  if (typeof Math[key] === 'function') Number.prototype[key]= () => Math[key](this);
});

And it turns out that here, the outer/enclosing context `this` isn't the one you want/need. You'd need a dynamically bound `this` instead:

Object.getOwnPropertyNames(Math).forEach((key) => {
  if (typeof Math[key] === 'function') Number.prototype[key]= (this) => Math[key](this);
});

and thus the this-in-the-parameters-list trick.

I don't think it's such a rare case: Inside a constructor function called with `new`, yes, `this` is most likely going to be the right `this` always, but when you are building objects with a factory (e.g. with a .create() method), the enclosing `this` usually isn't going to be the right one.
-- 
Jorge.


More information about the es-discuss mailing list