Hi,  

I just wanted to bring up IMO important limitation of arrow functions. They do 
solve unbound `this` issues when used as a callback, but they also introduce 
unfortunate limitation. Arrow functions can not really be
used as methods. For example it was great that in JS one could write a function 
that could be used as
a method or as function:

function map(f) {
  return this.reduce((result, value) =>  result.concat([ f(value) ]), [])
}

// Use as method
foo.map = map;
foo.map((x) => x + 1)

// Use as function
map.call(bar, (x) => x + 1)

I would say still is unfortunate that such reusable functions had do be called 
via special `.call` but never the less code sharing was simple to do.

Now arrow functions as they stand today can not be used in that manner as 
`this` refers to the outer scope `this` for a good reason. But it still would 
be nice to allow reusing them as methods, in fact they could be even solve 
current `map.call(…)`. What I'd like to propose is borrow successful idea from 
other languages and make:

foo.map((x) => x + 1)  

be a sugar for

map(foo, (x) => x + 1)

If `map` is an arrow function

That would make (arrow) functions a lot more composable:

var map = (list, f) =>
   list.reduce((result, value) => result.concat([ f(value) ]), [])

List.prototype.map = map

List().map((x) => x + 1)

or  

map(List(), (x) => x + 1)

or

map([ 1, 2, 3 ], (x) => x + 1)


I think this would make a good synergy of OO and functional styles in JS


Regards
--
Irakli Gozalishvili
Web: http://www.jeditoolkit.com/

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to