Assignment of global variables deleted by their RHS in strict mode

Allen Wirfs-Brock allen at
Wed Aug 26 23:05:46 UTC 2015

On Aug 26, 2015, at 3:17 PM, Mark S. Miller wrote:

> On Wed, Aug 26, 2015 at 2:55 PM, Kevin Gibbons <kevin at> wrote:
> See the following test262 test: (and related tests with update / compound assignment).
> In short, it is possible to have a Reference to a global variable which has been deleted. Normally, bare assignments to undeclared variables in strict mode cause ReferenceErrors. However, calling PutValue on a reference to a global variable which has been deleted since the reference was created does not throw a ReferenceError in strict mode, even though, *at the time of writing*, that variable does not exist.
> As far as I can tell, this is true in ES5 as well as ES6, but none of {V8, SpiderMonkey, JavaScriptCore, Nashorn} get it right. This is consistent and makes sense, but is it intentional?
> Hmmm, interesting. It was not the intention of the strict mode design to allow this to slip by without a thrown error. If we had explicitly considered this issue during the early strict mode design, we definitely would have made this a thrown error of some sort. ReferenceError sounds good to me, but I can't say that we would not have decided on TypeError. Either seems plausible enough.
> I agree that the silent failure implied by the current spec is buggy. Please file a bug against the ES6 spec. We should correct this at least in the errata.

A fix for this would be in, insert between the current steps 4 and 5:

4.5  If S is true, then
        a.   Let stillHasBinding be ObjRec.HasBinding(N).
        b.   ReturnIfAbrupt(stillHasBinding).
        c.   If stillHasBinding is false,  throw a ReferenceError exception.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the es-discuss mailing list