On Sun, Jul 25, 2010 at 11:36 AM, Brendan Eich <bren...@mozilla.com> wrote:

> On Jul 25, 2010, at 10:52 AM, Mark S. Miller wrote:
>
> The problem is that as long as ASI exists, one will often see working code
> such as this, since it does usually work. This training of the eye is a kind
> of habituation, and in this case it is insidious because it desensitizes the
> programmer from a pattern that *should* look malformed but doesn't.
>
> Ok, I'll grant you ASI desensitization is a factor in human readers missing
> this kind of bug.
>
> In the absence of ASI, such code would never normally appear in running
> code.
>
> Come on! "Never" ("normally" doesn't count, it's just hedging in a way that
> tends to assume the conclusion) must mean that if only we didn't suffer from
> ASI-based desensitization to missing semicolons, we would have
> perfect manual semicolon insertion and perfect code auditing and testing.
> But utopia is not an option.
>
> This hazard is insidious because testing may fail to uncover it, since
> tests have bugs too, test coverage is never perfect, and what's more, if the
> function expression itself returns a similar enough function, the caller of
> the stored method might not notice any malfunction.
>
> So let's agree on "less often" -- not "never".
>

Sure.



> When it does appear in running code, that should alert the programmer that
> their program violates their intention and needs to be fixed.
>
> That's nice, but "should" is not good enough. Empirically, it doesn't work
> that way. I'm not just going by my experience, but by the jibbering page,
> the bug reports I've seen, the Dojo guys who do use semicolons still having
> to ward off this hazard with a leading ; in each source file.
>
> Let's not go in circles. I claim:
>
> * The horses are long gone from the barn.
> * The mistake is easy to overlook even for JS coders who do use semicolons.
> * The trade-off of banning ASI rule 1 first bullet to reduce
> desensitization and eventually reduce the incidence of this kind of bug is
> not a clear win, vs. migration tax into Harmony and usability problems even
> writing fresh code.
>
> In order to reliably remove this hazard, we would need to ban statements
> from starting with '('. Perhaps we should consider doing so.
>

The problem there is the common module pattern

    (function(){
      ...
    })();

Although less common, defining an anonymous object literal and using it
inline is perfectly sensible:

    ({
      ... // includes methods mentioning "this"
    }).foo(...);

Perhaps, under the hypothetical opt-in, we should also consider
CallExpression a restricted production?

    CallExpression : ...
        CallExpression [no newline here] Arguments

This would more reliably catch the above hazards without breaking pleasant
legitimate uses.

>
> /be
>
>


-- 
    Cheers,
    --MarkM
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to