John, perfect except the new. The Function itself returns an anonymous function. new in front of a function like this:
var o = new function(){ return function(){}; }; simply means that o will bhe the function and new will be ignored (if a function return an instance of something, it does not matter if you use new before or not) Accordingly, new Function is a common mistake, unless somebody demonstrates that it makes logically or practically sense :-) quick patch, remove new, just Function(whatever)(); On Wed, May 20, 2009 at 10:29 PM, John Resig <jere...@gmail.com> wrote: > Ticket filed: > http://dev.jquery.com/ticket/4680 > > Fix landed: > http://dev.jquery.com/changeset/6361 > > --John > > > On Wed, May 20, 2009 at 10:24 AM, John Resig <jere...@gmail.com> wrote: > >> Ok, it all sounds in order to me - someone want to file a ticket? >> http://dev.jquery.com/newticket >> >> --John >> >> >> >> On Wed, May 20, 2009 at 10:04 AM, mike.helgeson >> <mike.helge...@gmail.com>wrote: >> >>> >>> The YUI compressor does not seem complain about using the Function >>> technique. >>> >>> (function(){ >>> >>> function evaluate( data ){ >>> return Function("return "+( data ) )(); >>> }; >>> >>> })(); >>> >>> becomes... >>> >>> (function(){function A(B){return Function("return "+(B))()}})(); >>> >>> >>> On May 20, 9:06 am, John Resig <jere...@gmail.com> wrote: >>> > Has anyone been able to figure out if YUIMin still behaves as you would >>> > expect it to? >>> > >>> > --John >>> > >>> > On Wed, May 20, 2009 at 6:48 AM, Andrea Giammarchi < >>> > >>> > andrea.giammar...@gmail.com> wrote: >>> > > Ok, the reason eval is so slow is because of FireBug, it costed 17 >>> seconds >>> > > with FireBug enabled while FireBug seems to do not affect Function >>> execution >>> > > (which makes Function against better than eval). >>> > >>> > > In any case, Function is faster or exactly fast as eval is, even in >>> > > Internet Explorer, at least in my tests. >>> > >>> > > this is a truly simple readapted test case: >>> > >>> > > <!DOCTYPE html> >>> > > <script type="text/javascript"> >>> > > portable = (function(msg, i, interval){ >>> > > function timeout(){ >>> > > alert(msg.join("\n")); >>> > > msg = []; >>> > > i = 0; >>> > > }; >>> > > return { >>> > > log:function(test){ >>> > > msg[i++] = test; >>> > > clearTimeout(interval); >>> > > interval = setTimeout(timeout, 100); >>> > > } >>> > > } >>> > > })([], 0, 0); >>> > > var count = 10000, o = null, i = 0, jsonString = >>> > > >>> '{"value":{"items":[{"x":1,"y":2,"z":3},{"x":1,"y":2,"z":3},{"x":1,"y":2,"z":3},{"x":1,"y":2,"z":3},{"x":1,"y":2,"z":3}]},"error":null}'; >>> > > var beginTime = new Date(); >>> > > for ( i = 0; i < count; i++ ) >>> > > o = eval( "(" + jsonString + ")" ); >>> > > portable.log( "eval:" + ( new Date() - beginTime ) ); >>> > > var beginTime = new Date(); >>> > > for ( i = 0; i < count; i++ ) >>> > > o = new Function( "return " + jsonString )(); >>> > > portable.log( "new Function:" + ( new Date() - beginTime ) ); >>> > > var beginTime = new Date(); >>> > > for ( i = 0; i < count; i++ ) >>> > > o = Function( "return " + jsonString )(); >>> > > portable.log( "Function:" + ( new Date() - beginTime ) ); >>> > > var beginTime = new Date(); >>> > > var callback = Function( "return " + jsonString ); >>> > > for ( i = 0; i < count; i++ ) >>> > > o = callback(); >>> > > portable.log( "precompiled Function:" + ( new Date() - beginTime ) ); >>> > > if(this.JSON){ >>> > > var beginTime = new Date(); >>> > > for ( i = 0; i < count; i++ ) >>> > > o = JSON.parse(jsonString); >>> > > portable.log( "native:" + ( new Date() - beginTime ) ); >>> > > }; >>> > > </script> >>> > >>> > > Let me know what you think. >>> > >>> > > Regards >>> > >>> > > On Wed, May 20, 2009 at 7:43 AM, Andrea Giammarchi < >>> > > andrea.giammar...@gmail.com> wrote: >>> > >>> > >> As I said, Function does not do scope resolution except the global >>> one so >>> > >> in my opinion should be always preferred for JSON evaluations. >>> Firefox does >>> > >> not care about implicit returned value plus brackets plus scope, it >>> simply >>> > >> create the anonimous function doing a syntax check and returns >>> errors only >>> > >> at call time so if there are no errors the precompiled funcion will >>> be like >>> > >> a manual one, time for parsing syntax is then one against every eval >>> call. >>> > >> To be fair, that bench make sense declaring the function once and >>> simply >>> > >> calling it inside the for to always return the same object. >>> Unfortunately >>> > >> this is not a real world case. >>> > >>> > >> On May 20, 2009 7:33 AM, "Michael Geary" <m...@mg.to> wrote: >>> > >>> > >> Function( 'return ' + data )() is also MUCH faster in Firefox than >>> eval. >>> > >>> > >> In a test case of JSON data containing 1000 names and addresses >>> (about >>> > >> 112KB), eval() takes a full second to execute on my machine in >>> Firefox 3. On >>> > >> all other browsers (including IE!) it takes hardly any time at all. >>> > >>> > >> The Function version takes essentially no time in Firefox. (Didn't >>> test it >>> > >> in other browsers.) >>> > >>> > >> -Mike >>> > >>> > >> ------------------------------ >>> > >> *From:* jquery-dev@googlegroups.com [mailto: >>> jquery-...@googlegroups.com] >>> > >> *On Behalf Of *John Resig >>> > >> *Sent:* Tuesday, May 19, 2009 4:20 PM >>> > >> *To:* jquery-dev@googlegroups.com >>> > >> *Subject:* [jquery-dev] Re: window['eval']() in rhino >>> > >>> > >> > I don't remember the original discussion/change, off-hand. If >>> YUIMin is >>> > >> still able to generate an ... >>> >>> >> > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to jquery-dev@googlegroups.com To unsubscribe from this group, send email to jquery-dev+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---