- From: Andrew Fedoniouk <news@terrainformatica.com>
- Date: Sun, 02 Jul 2006 14:10:12 -0700
----- Original Message ----- From: "Ian Hickson" <ian@hixie.ch> To: "Andrew Fedoniouk" <news at terrainformatica.com> Cc: <vladimir at pobox.com>; "Benjamin Joffe" <canvasgame at gmail.com>; <whatwg at whatwg.org> Sent: Sunday, July 02, 2006 12:59 PM Subject: Re: [whatwg] Canvas 2d methods > On Sun, 2 Jul 2006, Andrew Fedoniouk wrote: >> > On Sat, 1 Jul 2006, Andrew Fedoniouk wrote: >> > > >> > > In prototype based languages it is almost impossible to implement >> > > 'with' effectively in the given notation. >> > > >> > > ctx.moveTo(0,0).lineTo(10,10); >> > > >> > > is more effective. In some circumstances - in times. >> > >> > Why is it more effective for JS? >> >> foo.bar() >> >> requires lookup only in foo and its proto chain. And > > ...for "bar". It still requires a complete lookup for "foo" in all the > parts of the scope chain. 1) if it is declared as var foo = something; in current frame then foo.bar(); foo.baz(); then execution is quite efficient. But with(something) { bar(); baz(); } still requires scan of the whole universe in the worst case. Consider this: with(ctx) { bar( some_var_name ); } runtime will scan full chain of ctx for some_var_name. What for? -------------- something.bar().baz() is even more efficient than var foo = something; foo.bar(); foo.baz(); (Good bytecode optimizer can make it exactly something.bar().baz() but...) >> with( foo ) { bar = 1; } >> >> and foo does not contain that bar you need to scan whole namespace chain >> (with case). In short 'with' creates additional level of ambiguity. > > This is only the case where you don't know what "foo" will contain. In > this case what "foo" contains is very explicitly defined. > True. But evil is as always in worst cases. Andrew Fedoniouk. http://terrainformatica.com
Received on Sunday, 2 July 2006 14:10:12 UTC