> I would argue that – in ES.next – whenever a function is passed as an 
> argument, one should always assume that it is a non-method function and 
> completely ignore `this`.
> 
> This makes me sad. Seems like functions are going to be a little less first 
> class than they were before - and for fairly arbitrary reasons (the 
> introduction of tight-bound |this| in one syntax varietal). And not being 
> able to assume call and apply will work on any given function feels like the 
> road to deprecation. 

They still work, you just cannot set `this`, which you can’t, either, if you 
use bind:
    > function foo() { "use strict"; return this; }
    > foo.bind("hello").call("abc")
    'hello'

>> What is the use case for a non-method function with dynamic this?
>> 
>> a) Invoke callback in my context
> 
> Alternative: introduce an additional parameter for the context.
> 
> Again - why do we need to get clunky suddenly?

I’d call it more explicit. Why use an OOP construct if, conceptually, it is 
just another (non-method) function parameter?

>> b) Functional mixins
> 
> Alternative: use object literals to specify those.
> 
> Functional mixins are flexible and intuitive. I've used them to great effect. 
> Yes there are alternatives but again a little piece of the language dies.

Can you give an example?


>> c) Namespacing by call/apply
> 
> Alternative: use modules.
> 
> See above.

I’m already very happy with Node.js modules and AMDs. Can’t imagine myself 
going back to manual namespacing.

> Additionally, there are generic methods. But those are methods. And they 
> would work better as non-method functions, anyway. IIRC, there is a proposal 
> for making them available as such (e.g. via a module). Lastly, the main 
> raison d’être of generic functions was `arguments`. With `arguments` on its 
> way out, we’ll need them less.
> 
> If we can make this work, it will make JavaScript a much simpler language, 
> much easier to understand for newcomers. Hence, I’m not trying to be glib, 
> above, I’m arguing in favor of making things simpler.
> 
> Overall I don't see this getting simpler. Six |this| rules instead of five; 
> static and dynamic |this| binding instead of just dynamic; loss of guarantee 
> re. the nature of function arguments.

Function arguments won’t change, I’d just expect passing `this` to a function 
to happen less. Thankfully, we’ll have the spread operator to take over most of 
apply’s duties.

To me, things become simpler, because I’ll automatically use the right tool:

1. Instead of constructors, I have class declarations that set up subtyping 
correctly.
2. Method definitions will make sure that `super` works and will be less to 
type. Dynamic this implies method to me.
3. If I use a function expression inside a method, I always want it to have 
lexical this. I think that is the default that makes most sense, conceptually.

These are three rules, easy to follow: method versus (non-method) function 
versus object factory.

> If old-school functions are replaced by class declarations (constructors), 
> arrow functions (non-method functions) and method definitions (methods), one 
> will automatically do the right thing.
> 
> Thats three types of functions now. Our legacy code is going to be confused.


A definite possibility. However, the only problem I can see is a function 
expecting to pass `this` to a callback. If the callback has been created via 
bind(), it is out of luck, already. Are there other problems?

-- 
Dr. Axel Rauschmayer
[email protected]

home: rauschma.de
twitter: twitter.com/rauschma
blog: 2ality.com

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to