On Mar 15, 9:06 am, Robert Kieffer <[email protected]> wrote:
> On Mar 14, 8:24 am, kangax <[email protected]> wrote:
>
> > Why not combine two?
>
> > ...
> > function() {
> > if (arguments.length) {
> > var ll = arguments.length;
> > args.length = l + ll;
> > while (ll--) {
> > args[l+ll] = arguments[ll];
> > }
> > }
> > return fn.apply(context, args);}
> > }
>
> This implementation won't work. "args.length" must be set for each
> call. Failure to do so will result in bugs like this (since args is
> shared across method calls):
>
> foo = someFunc.bind(1,2)
> foo(3) // calls someFunc(1,2,3)
> foo() // also calls someFunc(1,2,3)! (args unchanged from before)
>
> Thus, you have to move the "args.length=" assignment above the if
> block:
>
> > function() {
> > var ll = arguments.length;
> > args.length = l + ll;
> > if (ll) {
> > while (ll--) {
> > args[l+ll] = arguments[ll];
> > }
> > }
> > return fn.apply(context, args);}
> > }
>
> ... and since "if (ll)" is redundant with "while (ll--)", you can get
> rid of it:
>
> > function() {
> > var ll = arguments.length;
> > args.length = l + ll;
> > while (ll--) args[l+ll] = arguments[ll];
> > return fn.apply(context, args);}
> > }
>
> ... which, is the implementation I proposed in my previous post.
Understood.
>
> Regarding your point about the 4 possible outcomes. We're not
> disputing the implementation for cases 1 or 2 - it's cases #3 and #4
> that are what we care about, both of which end up having to run thru
> the above code. Given this, my claim about this being a tradeoff
> still stands. Reusing the 'args' array is faster if arguments are
> passed, but is slower if they aren't, because you have to take the
> time to do "args.length=..." in either case. My performance tests
> show this, and I still think it's a good tradeoff to make.
Yes. As I said before, this is a good optimization of partial
application (cases #3 and #4). I like it and I don't have problems
with it being in a Prototype. All I'm saying is that optimizing cases
#3, 4 is not as important as optimizing cases #1, 2, as these are the
most widely used ones. Of course, it doesn't make your optimization
any less useful for a particular use case.
Tobie, are you OK with these changes?
>
> Regarding the viability of "bindAsEventListener", I see that as a
> separate discussion. The kind of performance tweaks we're talking
Yes, we need a new thread for that.
> about just don't matter that much where bindAsEventListener is used
> (since it's unlikely event listener functions will be called more than
> a few dozen times per second.) That said, I do agree that it is a bit
Actually, frequent event listeners (mousemove, mouseover, mouseout,
scroll, resize, etc.) are called quite often. I never use Prototype's
bind on them, for example, as it slows things down noticeably. It's
just that `bindAsEventListener` is practically useless, since you
rarely want to curry arguments over event listeners.
> of a wart on the Prototype API.
>
> On the more general topic of binding arguments, Prototype has gone
> down a bit of a bad path with all of this. I've never seen a real
> need for this support in the bind() method. It's just as easy to bind
> values via closure context as it is to do using bind():
We already discussed the issues of binding earlier in this thread : )
>
> var a = 1, b = 2;
> var foo = function() {
> // reference something with a & b
> }.bind(obj);
Now imagine `foo` is declared non-locally (in a different execution
context)
>
> This code would clean up nicely if Prototype deprecated support for
> argument binding. Not that that's gonna happen. I'm just saying. :-)
This is very unlikely. ES3.1 `Function.prototype.bind` does partial
application. When browsers implement `bind` natively, it will be easy
to delegate Prototype's bind to native one (or replace it altogether)
--
kangax
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Prototype & script.aculo.us" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~----------~----~----~----~------~----~------~--~---