Sigh. You are completely correct. This is goofy and strict mode should have disallowed it. It is so goofy that I have to observe: No one has yet shipped even a beta implementation of full strict mode, so practically it is not too late for the browser makers to all agree to reject this case with a static error. If none disagree, perhaps it is not too late to add this to the ES5 errata, even though it is a spec change and not "really" an errata. It won't be our first such.
On Tue, Oct 12, 2010 at 1:40 AM, David Herman <[email protected]> wrote: > ES3 `catch' is block-scoped. At the last face-to-face, we talked about > statically disallowing var-declarations from hoisting past let-declarations: > > function f() { > { > let x = "inner"; > { > var x = "outer"; // error: redeclaration > } > } > } > > I just noticed a case I missed in the discussion, which has actually > existed since ES3: > > function g() { > try { > throw "inner"; > } catch (x) { > var x = "outer"; > } > } > > This is allowed, and it binds a function-scoped variable x, while assigning > "outer" to the catch-scoped variable x. This is pretty goofy, and almost > certainly not what the programmer expects. And it's exactly analogous to the > function f above, which SpiderMonkey currently rejects and we all agreed > Harmony ought to reject. > > It's too late to add this case to ES5's strict mode restrictions, but I > propose we ought to reject it in Harmony. > > Dave > > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss > -- Cheers, --MarkM
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

