>>>> Do we really need the dynamic this arrow ->, or can we make do with just 
>>>> the lexical this arrow =>.
>> Are functions that depend on dynamic |this| ever *not* methods?
> 
> Sure. The main use-case is constructors (and you can make a function do 
> double-duty, as a constructor or a function called without 'new').

With classes, constructors will become methods, right?

> Also, some times, people write functions not used as methods but called via 
> .call or .apply. It happens.

Wouldn’t it be better to have lexical |this| in these cases, so that 
foo.call(null, ...) does not affect |this|? But I see what you mean, you cannot 
use normal .bind(), because of the way it handles the arguments that the bound 
function receives. Maybe use something like the following to implement =>, then?

Function.prototype.bindOnlyThis = function (myThis) {
    var that = this;
    return function() {
        return that.apply(myThis, arguments);
    };
}

>> Wouldn’t you always want to use an object literal for methods, especially if 
>> some features (such as |super|) depend on it?
> 
> Probably. But so what?
> 
> We're not making mandatory syntax either way with function, so why should we 
> with arrow?

Old-style functions would be rarely used and there would be a clear separation 
of concerns:
- Want a method? Use an object literal.
- Want a function that is not a method (i.e., lexical this)? Use an arrow 
function with =>

This would make things easier to understand. When I explain this aspect of 
JavaScript to others, they are often stumped, but I have never encountered 
anyone who was confused by Python:
class MyClass:
    def mymethod(self):
        return "hello world"
def myfunction():
    return "hello world"

So this is probably my real point: can we make things as un-confusing as in 
Python?

>> Maybe I just like the distinction introduced by block lambdas too much:
>> - dynamic this --> existing functions and methods
>> - lexical this --> new, more compact construct, mainly used as the argument 
>> of functions and methods.
> 
> Block-lambdas are not arrows. Arrows are just syntax and try to shorten 
> function usage in general (including the .bind or var self=this; idiom). 
> Block-lambdas must preserve Tennent's Correspondence Principle, so they have 
> no choice but to treat |this| lexically.

I know. But block-lambdas enforce a separation of concerns (because they have 
no choice, really) that I would like short-syntax functions (arrows or not) to 
enforce, as well.

>> This distinction works well as a rule of thumb and keeps things easy to 
>> explain.
> 
> It's not that simple: existing functions can and do use various binding hacks 
> to make |this| or a substitute "lexical". Anyway, functions have |this| 
> parameters, whether created by old function or new arrow syntax.

Right. That could be a problem, the abstraction I have in mind might become 
leaky at some point.

-- 
Dr. Axel Rauschmayer

[email protected]
twitter.com/rauschma

home: rauschma.de
blog: 2ality.com



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

Reply via email to