The global object in browsers

Brendan Eich brendan at mozilla.com
Tue Feb 17 15:16:37 PST 2009


On Feb 17, 2009, at 3:09 PM, Brendan Eich wrote:

> On Feb 17, 2009, at 2:48 PM, Mark Miller wrote:
>
>> On Tue, Feb 17, 2009 at 2:02 PM, Ian Hickson <ian at hixie.ch> wrote:
>> Now, if the other page's script calls f() and g(), it will get  
>> different
>> results (2 and 1 respectively, if I didn't screw up the example  
>> code).
>>
>> For HTML5, this behaviour has been defined in more detail. The global
>> object is a Window object. This object is per-Document. The object
>> returned by the "window" attribute on that global object is  
>> actually a
>> WindowProxy object, which forwards everything to the "current" Window
>> object.
>>
>> What do you mean by "current"? Are you proposing to legitimize the  
>> dynamic scoping behavior demonstrated by your example?
>
> What Ian showed is not dynamic scoping.
>
>   var global = this;
>   function g() { return global.x; }
>
> The issue is what global.x means after the current page (the one  
> containing the script including these two lines) has been unloaded  
> and a new page loaded (while some other window keeps a reference to  
> g).

The call to g comes from another window, and it would be dynamic  
scoping if that window were the global object for the activation of g.  
It's not. The other window is nowhere on the scope chain. The only  
issue is whether the proxy forwards to the inner in which g was bound,  
or the current inner.

Finding the inner in which g was bound from the proxy is not feasible  
in general. But we could find g's statically linked scope parent  
([[Scope]] in ES3), which would be the inner in which g was defined. I  
raised this idea on IRC recently, and Hixie replied that the proxy  
(denoted by global) might have no relation to g's [[Scope]].

But that could in theory be handled, I think, by comparing the proxy  
to which global was bound to the proxy for g's [[Scope]] (inners keep  
track fo their outer, that is easy; the reverse is 1:N and not easy).  
If the same proxy is associated with g's [[Scope]] as is the base of  
the reference being evaluated in g, then use g's [[Scope]]. Else use  
the current inner global for the proxy.

This could be done, but it would add a kind of alias checking to all  
property accesses. And it's not what any browser does. So it's  
probably right out, but I wanted to raise it in detail.

/be
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20090217/27c454ba/attachment-0001.html>


More information about the Es-discuss mailing list