hoisting past catch

David Herman dherman at mozilla.com
Mon Oct 11 16:40:01 PDT 2010


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



More information about the es-discuss mailing list