Never mind. On es5-discuss we've decided that the change was a bug and we're reverting back to non-configurable. I think this is good.
On Mon, Jul 20, 2009 at 5:02 PM, Mark S. Miller<[email protected]> wrote: > > Given the four relationships we seek between ES5 and a future > Cajita-like language (bottom of > <http://code.google.com/p/google-caja/wiki/SubsetRelationships>), does > this argue for one of these possibilities over the other? > > > ---------- Forwarded message ---------- > From: Allen Wirfs-Brock <[email protected]> > Date: Mon, Jul 20, 2009 at 4:45 PM > Subject: bug or feature: global declarations create configurable > properties on global object > To: "[email protected]" <[email protected]> > > > I’ve found what is probably a bug in the ES5 spec. that could also be > considered a feature… > > > > ES3 says (10.2.1): “Variable instantiation is performed using the > global object as the variable object and using property attributes { > DontDelete }.” In ES5 terms, the attributes of an ES3 global > declaration are {writable: true, enumerable: true, configurable: > false}. This means that in ES3 global var statements or function > declarations create properties on the global object that cannot be > deleted. > > > > The current ES5 draft, following the logic starting in Declaration > Binding Instantiation (10.5) step 4.d or 5.c.i for global declarations > goes through CreateMutableBinding for ObjectEnviornmentRecords where > we see that [[Put]] is used to create the global object property. > (note this only happens with the property doesn’t already exist). > [[Put]] sets the attributes of a new property to {writable: true, > enumerable: true, configurable: false}. This means that as currently > written ES5 global var statements or function declarations create > properties on the global object that can be deleted. > > > > If the ES5 spec. is left as written this would be a “breaking change” > (although perhaps a very minor one) from ES3 that conceivably might > break somebody’s existing code. On the other hand, setting an ES5 > property’s configurable attribute to true has broader implications > than those associated with the ES3 DontDelete attribute. In > particular, if global declarations create properties on the global > object with configurable: true then the following would be precluded > for those properties: > > · They cannot be deleted (same as in ES3) > > · Their enumerable attribute cannot be set to false. > > · They cannot be converted into a accessor properties. > > Of course, there would be an easy work around to such limitations. > Instead of using a var or function declaration to create such > properties use a Object.defineProperty(this,…) at the global level. > > > > I don’t recall that we ever discussed this issue. The ES5 change is > probably just a compatibility bug that creeped in when I rewrote > section 10 however I might have intentionally made the change with the > intention of bringing it up for discussion and then have forgotten to > do so. > > > > What do people think? Is this a feature or a bug? I either need to > add a new item to Annex E explaining the incompatibility or make > appropriate changes to section 10 to make it match the ES3 semantics. > Which should I do? > > > > Allen > > _______________________________________________ > es5-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es5-discuss > > > > -- > Cheers, > --MarkM > -- Text by me above is hereby placed in the public domain Cheers, --MarkM
