On Apr 1, 2012, at 8:07 AM, Quildreen Motta wrote:
> Is there any particular reason optionally dynamic `this' got ditched from the
> current arrow syntax proposal? It's one thing that, I think, would make it
> more useful than just being used for inline callbacks.
Yes, because it is unnecessary and would just add more confusion to the already
too confused understanding of "this" by most JS programmers.
>
> Plus, with a syntax like:
>
> ---
> let ps = { lookahead: (this, n) => { this.current().slice(0, n || 1) }
> , current: (this) => { this.text.slice(this.offset) }
> , move: (this, n) => { this.clone(this.text, this.offset + 1) }
> , clone: (this, text, offset) => { let r = Object.create(this)
> , r.offset = offset || 0
> , r.text = text || '' }
> }
> ---
How is the above better (ignoring any controversy about line-beginning
separators) than:
let ps = {
lookahead ( n) { this.current().slice(0, n || 1) },
current() { this.text.slice(this.offset) },
move(n) { this.clone(this.text, this.offset + 1) },
clone(text, offset) {
let r = Object.create(this);
r.offset = offset || 0;
r.text = text || '';
}
}
>
> You'd perhaps avoid some of the confusion on dynamic `this' by making it
> explicit that `this' is just an additional parameter passed over to the
> function — albeit implicitly.
"this" isn't just an additional parameter and trying to turn it into such just
creates more confusions. this (aka self) is a characteristic feature of
object-oriented methods, not of functions. Methods only have meaning in the
context of an object. It is essential to the OO programming model that
this/self is dynamically bounds to the object that is the target of each
method invocation. In a well designed OO language the method invocation target
is syntactically distinct from "other parameters". If this didn't have special
OO semantics there would be no reason to have special syntax and semantics for
defining/accessing this within a function. However, in that case you don't
have a OO language, instead you have a functional language that is used to
provide a (low fidelity) simulation of OO constructs.
The confusion about this in JS comes from at least four things.
1) It is too easy to define a "method" (a function that uses a dynamic
per-invocation this binding) that is not directly associated with an object (or
class/prototype).
eg: var f = function() {this.foo()};
2) In classic JS there was no syntax that distinguished the intended definition
of a method from a function, other than the appearance of this in the body of
the function.
3) It is too easy to extract a method from an object (or class/prototype),
breaking the association between the method and object.
eg: var g = String.splice;
4) It is too easy to call a disassociated method without an object association
as if it was a regular function
eg: f();
The confusion is only worsen by things like jQuery choosing to exploit such
disassociated methods to create non-OO idioms using this
> It seems to work for Python, though there `self' is bound at the
> instantiation time.
I don't believe this is correct, if you mean object instantiation time. You
can view obj.meth in Python as a left-curry operation that creates a new
function where the first parameter of meth is pre-bound to obj. This is why
Python does not have issue 3 above.
Regardless, Python is also a retrofitted OO language where arguably objects are
even less central to the language than in JS.
Allen
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss