Caveat: I am aware that what I’m suggesting might clash too hardly with current 
semantics (how to handle invocation, apply(), call(), etc.), but I am 
interested in the arguments against it.

>> (1) I would prefer non-method functions not to have a binding for |this| at 
>> all.
> 
> How do you define "non-method"?

A function that is not invoked as method. Right now, the same kind of construct 
is used for both true functions and methods. I’m proposing a new construct 
(similar to the distinction that Python makes): a function that does not have 
an implicit |this| parameter.

> It would make an early error for many functions written today as function 
> declarations, which use |this| because they are assigned as property values 
> (i.e. as methods), to call the |this| usage in such functions an early error. 
> That would be a harsh migration tax, even though compile-time. We are not 
> changing Harmony that much.

Right. It could be introduced via the arrow function syntax, with the 
"function" operator remaining as is:

var obj = {
    id: "123",
    method: (x) => {  // same as function operator
        [1,2].forEach((i) -> {  // new construct
            console.log(this.id + ": " + i + " - " + x);
        });
    }
}

Thus:
=> and function: |this| is an implicit argument (“methods”)
->: |this| is not an implicit argument; currently simulated via binding 
(“functions”)

The arrows are swapped compared to the strawman, because => is more 
“heavy-weight” here.

>> Isn’t (1) a better solution?
> 
> Why?

It is easier to understand for beginners. |this| always being an implicit 
parameter trips up many newbies. I also find it a cleaner way of getting 
lexical |this|.

>> I’m assuming (2) is done, because (1) would be too radical a change 
>> (execution contexts etc.)?
> 
> Think migration tax. Many functions whether declared or expressed use |this| 
> today. They are used as methods but the linkage to their method name 
> (property of an object) is not declared or even expressed nearby. How would 
> you forbid such functions to use |this|, or allow them to but forbid others 
> that are not called as methods to use |this|/

See above.

Greetings,

Axel

-- 
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