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
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to