Why are global variables *non-deletable* properties of the global object?
Mark S. Miller
erights at google.com
Thu Jun 19 20:40:43 PDT 2008
On Thu, Jun 19, 2008 at 6:33 PM, Brendan Eich <brendan at mozilla.org> wrote:
> On Jun 19, 2008, at 4:39 PM, Mark S. Miller wrote:
> How did you test?
I was indeed using the squarefree shell.
> Try putting this in a Firefox address toolbar:
> You will get true (because the var binding -- not initialization -- is
> (because var makes a DontDelete binding outside of eval), and 42.
I did. Thanks for suggesting that experiment. But given the above
behavior, I don't understand
alert(delete window.foo); alert(window.foo)
I get true, true, undefined.
It seems that the "var foo = 42;" created a DontDelete window.foo
property but the "window.foo = 43;" assignment somehow wiped out the
DontDelete attribute? Is this correct? Should it be?
>> I prefer FF and Safari's behavior to the ES3 specified behavior.
> Why? Lower integrity is not your style.
It's not yet clear to me which decision better supports integrity.
> Using var in closures for object state has higher integrity than using plain
> old properties. This makes closures better in addition to the name-hiding
> (private variable) benefits.
I don't understand this paragraph, and it seems crucial. Could you
>> should ES3.1 and ES4 codify as correct?
> I don't believe you've tested what you think you tested. If you are using
> the squarefree.com then you're not testing an ES-anything-conformant global
> object implementation!
I was indeed making that mistake.
>> Should we drop the
>> "DontDelete" in the spec language?
> Absolutely not. Besides giving integrity guarantees to programmers, it gives
> opportunities (binding name to slot ahead of time, or on first among many
I'll probably be happy with that. But I'd like to understand the
remaining anomaly above first. If it's considered correct, then I
don't see how any of these benefits follow.
More information about the Es4-discuss