Boris Zbarsky (2014-11-25T17:20:02.000Z)
d at domenic.me (2014-12-04T22:35:50.053Z)
On 11/25/14, 12:01 PM, Domenic Denicola wrote: > So, if I'm using my terms correctly, the "global environment record" contains the same variables, even though the global object has a completely new set of properties? You just said "the global object". There are two different global objects here, per spec. Let's call them X and Y (I considered B for "before" and A for "after", but that would be a bit confusing). We start out with global X (a Window instance). The function statement is evaluated with global X, so the function that's created has the Realm of X as its Realm. This function is then assigned to the onload property of X. The load event fires, and we call the function. It calls the "self" getter, which returns a WindowProxy. This is a proxy which is currently pointing to X. When we do self.x = "test", the set is forwarded along to X. When you do console.log(self.x) the get is forwarded along to X. When you do console.log(x), the "x" property is obviously found on X, since that's the global of the function. Alright, now you do document.open(). This creates a new global Y and changes the WindowProxy we have stored in oldSelf to point to Y instead of X. Getting "self" from Y returns the same WindowProxy as it used to return, so self === oldSelf. Now console.log(self.x) forwards the get to Y, which has no such property. console.log(x) is still looking up the property "x" on X, since the function we're in comes from that global, so it gets the value "test". Everything here seems sane to me so far. Well, as sane as anything ever is when WindowProxy is involved.