On dropping @names

David Herman dherman at mozilla.com
Thu Dec 27 12:08:18 PST 2012


On Dec 27, 2012, at 1:23 AM, Andreas Rossberg <rossberg at google.com> wrote:

>> Let's start with TDZ-RBA. This semantics is *totally untenable* because it goes against existing practice. Today, you can create a variable that starts out undefined and use that on purpose:
> 
> I think nobody ever proposed going for this semantics, so we can put that aside quickly. However:

OK, well, it wasn't clear to me.

>>     var x;
>>     if (...) { x = ... }
>>     if (x === undefined) { ... }
>> 
>> If you want to use let instead, the === if-condition will throw. You would instead have to write:
>> 
>>     let x = undefined;
>>     if (...) { x = ... }
>>     if (x === undefined) { ... }
> 
> That is not actually true, because AFAICT, "let x" was always understood to be equivalent to "let x = undefined".

Well that's TDZ-UBI. It *is* true for TDZ-RBA. Maybe I was the only person who thought that was a plausible semantics being considered, but my claim (P => Q) is true. Your argument is ~P. Anyway, one way or another hopefully everyone agrees that TDZ-RBA is a non-starter.

>> This is an assumption that has always existed for `var` (mutatis mutantum for the function scope vs block scope). You can move your declarations around by hand and you can write code transformation tools that move declarations around.
> 
> As Dominic has pointed out already, this is kind of a circular argument. The only reason you care about this for 'var' is because 'var' is doing this implicitly already. So programmers want to make it explicit for the sake of clarity. TDZ, on the other hand, does not have this implicit widening of life time, so no need to make anything explicit.

OK, I'll accept that Crock's manual-hoisting style only matters for `var`. I just want to be confident that there are no other existing benefits that people get from the equivalence (either in programming patterns or refactoring/transformation patterns) that will break.

> It's true that with TDZ, there is a difference between the two forms above, but that is irrelevant, because that difference can only be observed for erroneous programs (i.e. where the first version throws, because 'x' is used by 'stmt').

Can you prove this? (Informally is fine, of course!) I mean, can you prove that it can only affect buggy programs?

Dave



More information about the es-discuss mailing list