Jeff,

I think your real question reduces to this:

//none strict mode code
globalObj= function() {return this}();
print(otherGlobal.eval("this") === globalObj)  //??

The two different calls and the "indirect" name in your example may make the 
question seen like it is about something else (direct/indirect eval).

A more  generally, do built-in functions capture their global environment at 
the time of their creation or do they they operate in the dynamic context of an 
ambient global environment. I hope it is the former.

An example of the more general question would be:
print((Object.getPrototypeOf(new otherGlobal.Array(0)) ===  Array.prototype)

I believe the second example prints false for all browser implementations.

Allen



On Mar 3, 2011, at 2:39 PM, Jeff Walden wrote:

> A few months back I noticed an interesting interaction between how direct 
> eval is defined and multiple globals.  What happens if, in one global, you 
> call an eval from another global as if it were a direct eval?
> 
>  var indirect = otherGlobal.eval;
>  eval = indirect;
>  print(eval("this") === this);
>  print(indirect("this") === this);
> 
> Standards currently don't say what should happen here because it's multiple 
> globals, so what should this do?  IE9 and Opera print false both times for 
> this.  Firefox prints true, then false -- but only if the global and 
> otherGlobal are from the same origin (so on pages with the same 
> scheme/host/port, more or less).  If they're from different origins (but have 
> set document.domain to the same value) Firefox too prints false.  Chrome and 
> Safari throw an EvalError calling another window's eval (for both "direct" 
> and indirect calls) without that window as |this| for the call.
> 
> The Chrome/Safari behavior would resurrect the vestigial EvalError, so I 
> don't think it makes sense.  It also contradicts the specification of the 
> steps in the definition of the eval function.  Firefox's behavior is 
> inconsistent and seems not amenable to host-agnostic specification as ECMA 
> would require.  Thus we are left with the IE9/Opera behavior, which seems 
> sensible and natural to me: an eval function should always act in the context 
> of the global from which it came.
> 
> What needs to be done to standardize this behavior?  And more generally, what 
> needs to be done to begin standardizing multiple globals in ECMAScript, 
> including issues like this one?
> 
> Jeff
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to