Allen Wirfs-Brock (2014-11-25T19:48:09.000Z)
On Nov 25, 2014, at 11:27 AM, Boris Zbarsky wrote:

> On 11/25/14, 2:23 PM, Domenic Denicola wrote:
>> The only remaining issue is that ES specifies that `this` is the global object in script code, whereas in browsers `this === window`, i.e. it is not actually the global object but instead the WindowProxy.
> 
> Yep.  This is the one remaining problem with this whole setup.
> 
> Note that this is kinda needed for web compat no matter what we do with the document.open() case, by the way, because if people grab "this" and hand it out to some script outside the window in question and then navigate the window, the "some script" needs to end up having a proxy for the new global.

It would be trivial to change the ES spec. to allow for the script this binding and global object to be set to independent value when a Realm is created. 

Can anybody in ES land see any negative consequences to allowing this?

Note that the top-level this binding in a module has the value undefined.  This means that at a module top level: 'window.x' access 'x' via the window proxy, 'x' accesses via the global object, and 'this.x' throws.

Allen
d at domenic.me (2014-12-04T22:36:44.144Z)
On Nov 25, 2014, at 11:27 AM, Boris Zbarsky wrote:

> Yep.  This is the one remaining problem with this whole setup.
> 
> Note that this is kinda needed for web compat no matter what we do with the document.open() case, by the way, because if people grab "this" and hand it out to some script outside the window in question and then navigate the window, the "some script" needs to end up having a proxy for the new global.

It would be trivial to change the ES spec. to allow for the script this binding and global object to be set to independent value when a Realm is created. 

Can anybody in ES land see any negative consequences to allowing this?

Note that the top-level this binding in a module has the value undefined.  This means that at a module top level: 'window.x' access 'x' via the window proxy, 'x' accesses via the global object, and 'this.x' throws.