Right now I am not proposing but trying to understand why it is like this (and why on some aspects it is strange), and if by any chance a.b.c.d could be solved. Indeed this would require an early return from Accessors too after GetValue(base) . I don't understand why you focus on global var being created, this is not the case.

Maybe I am misreading something in the chain, the Accessors CheckObjectCoercible and GetValue IsUnresolvableReference look to be redundant in this case.

var a;
console.log(a.b); //TypeError for you (correct ?)- Reference error for me
console.log(c.d);//Reference error for me

Le 15/06/2012 16:56, T.J. Crowder a écrit :
On 15 June 2012 15:34, Aymeric Vitte <[email protected] <mailto:[email protected]>> wrote:

    I am not talking about defining implicit properties or such
    things, neither having undeclared stuff looking declared, but just
    changing the behavior of retrieving a property when base is
    undefined, which will then be undefined.

    If am I reading correctly the specs, doing this change will work
    for a.b.c.d, because undefined is returned first and nothing is
    set anywhere, unless I am wrong :

    console.log(a); //reference error

    var a;//undefined
    console.log(a.b);//reference error

    will become :

    console.log(a); //undefined

    var a;//undefined
    console.log(a.b);//undefined


So you're proposing two changes:

1. Let getting an unresolvable symbol evaluate to `undefined`, rather than causing a ReferenceError (which requires changing GetValue, at least), and

2. Allow accessing a property of `undefined` to evaluate to `undefined`, rather than causing a TypeError (which requires changing either how property accessors work, or changing the definition of CheckObjectCoercible so that it coerces undefined into {} or some such).

You'd need both of them to make `a.b` "work" (evaluate to undefined rather than throwing) where `a` is unresolvable, #1 to prevent the ReferenceError on `a`, and #2 to prevent the TypeError when trying to retrieve `b` from `undefined`.

Either would be a big, breaking change on its own.

Re #1: I wouldn't be in favor, FWIW. I think it's much better to have a ReferenceError on an unresolvable symbol than have it treated as though it were resolved, but had the value `undefined`. Again, the feature of strict mode where assigning to unresolvable symbols stopped creating global variables was a Good Thing(tm). :-) To me this is in the same vein as the old behavior there was. If I try to read the value of an unresolvable symbol, I want the proactive notification I get from the ReferenceError; I don't want to try to find the subtle bug the implicit `undefined` helps hide (in my view).

Re #2: I wouldn't be in favor, FWIW. Consider:

function foo(o) {
    console.log(o.msg);
}
foo();

Currently, the call to `foo` throws, because I'm not passing in any argument, but the code dereferences `o` without testing first. This is clearly a bug in the call to `foo`. Currently, I get proactive notification of that bug (via the TypeError). With change #2, the code would try to log undefined instead -- a much harder, more subtle bug to try to find and fix.

Yes, the current behavior wrt reading from unresolvable references vs. reading from undefined properties can be viewed, from some angles, as inconsistent. But it's very thoroughly ingrained in the language, and I don't see a strong argument for change.

Just my $0.02.

Best,

-- T.J.

--
jCore
Email :  [email protected]
Web :    www.jcore.fr
Webble : www.webble.it
Extract Widget Mobile : www.extractwidget.com
BlimpMe! : www.blimpme.com

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

Reply via email to