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]
