Sorry, I meant to say I want a "direct" eval call.  I want to be able
to set the "this" value.

On Feb 28, 9:57 am, mcot <[email protected]> wrote:
> I want to reassign eval but still be able to do indirect calls.  Is
> there any possible way to do this in chrome?
>
> neweval = eval;
> eval = <some new function>
>
> Where <some new function> would be something like this:
>
> function newEvalFuncton(evalString) {
>
>      /* do something with evalString */
>      /* call saved function neweval to perform the eval */
>
> }
>
> On Feb 27, 1:39 pm, Juriy Zaytsev <[email protected]> wrote:
>
>
>
>
>
>
>
> > On Fri, Feb 25, 2011 at 6:14 PM, mcot <[email protected]> wrote:
> > > I have some sample code below that generates a different result
> > > between browsers.  I *think* chrome is doing the wrong thing, but I
> > > wanted to ask here first.
>
> > >            function func(param) {
> > >                console.log(param.x)
> > >            }
>
> > >            x = 100;
>
> > >            // this is obv. 100
> > >            console.log(this.x)
>
> > >            var localObj = new function() { this.x = 90; }
>
> > >            // this is obv. 90
> > >            console.log(localObj.x)
>
> > >            wrapper = function(st) {
> > >                eval(st)
> > >            }
>
> > >           // this should be 90
> > >            str = "func(this)"
> > >            wrapper.apply(localObj, [str])
>
> > >            neweval = eval; eval = undefined;
>
> > >            wrapper = function(st) {
> > >                neweval(st)
> > >            }
>
> > >            // this is 90 in firefox, but 100 in chrome...
> > >            str = "func(this)"
> > >            wrapper.apply(localObj, [str])
>
> > [...]
>
> > A simpler example — to understand what's going on — would be something like
> > this:
>
> > var x = 'outer';
>
> > (function() {
>
> >   var x = 'inner';
>
> >   (1,eval)('console.log(x + " " + this)');
>
> > }).call({ });
>
> > Note that (1,eval) is there to create a so-called indirect eval call —
> > similarly to `wrapper` function in your example, which, when called, is an
> > indirect eval call as well.
>
> > As you can see, Chrome 10 and FF4 both evaluate code in global scope and set
> > this binding to that of global object. Firefox 3.6, however, evaluates code
> > in global scope but sets `this` to whatever is referenced by `this` of a
> > calling scope (empty object in the above example).
>
> > Chrome and FF4 follow ES5 behavior. FF3.6 goes somewhat against ES3 and ES5
> > and does its own mish-mash: evaluates code in global scope (which is a
> > de-facto standard across majority of implementations; even during the times
> > of ES3) but sets `this` to that of calling scope — which is what direct eval
> > call would do.
>
> > --
> > kangax

-- 
To view archived discussions from the original JSMentors Mailman list: 
http://www.mail-archive.com/[email protected]/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/[email protected]/

To unsubscribe from this group, send email to
[email protected]

Reply via email to