Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Like .quickEach, but subtly different
// Plugin released:
// http://benalman.com/projects/jquery-misc-plugins/#each2

padolsey commented Aug 1, 2010

Nice! Thanks for having a look Ben!

The try-catch is to make sure that jq[0] is cleared (even if an exception is thrown within the callback) -- otherwise memory leaks could potentially occur -- it's an edge case, but still...

padolsey commented Aug 1, 2010

I like the backwards-compatible each ... that may be a better option than adding a new quickEach method.

Owner

cowboy commented Aug 1, 2010

James, check out the new, third, approach.. it might be a good compromise!

Owner

cowboy commented Aug 1, 2010

Note that there is some extra-args-passing that the current jQuery.fn.each does that would have to be added in, but that's just an array concat / apply.

malsup commented Aug 1, 2010

$([]).length == $().length == 0

padolsey commented Aug 2, 2010

Can this be added to the core? I think it would be worth it!

Also, I think it'd be best to add the try-catch -- an exception thrown in a callback several times could cause a memory leak -- I might be completely wrong about this, but the fact that jq[0] won't be cleared presents a potential issue.

padolsey commented Aug 2, 2010

Plus I think the backwards-compatible suggestion is definitely the way to go!

Owner

cowboy commented Aug 2, 2010

Mike, any time I post/release a plugin, if I can make it backwards-compatible with older jQuery versions easily I will.. Since $([]) is a backwards-compatible way of "selecting" an empty set, I'll use that. Of course, for older jQueries, selecting document won't really consuming a whole lot of memory, but still.. that's how I roll!

Owner

cowboy commented Aug 2, 2010

James, I was thinking of releasing this as a standalone "jQuery fast .each" plugin, with code pretty much just as it is in this gist, and with the callback signature fn.call( dom_elem, i, jq_object ). Would you object to that? (I don't want to step on your toes here)

I also definitely think that this should be considered for inclusion in core, with Resig making whatever decision regarding its signature/context if necessary, should it ever get to that point. I personally feel that changing jQuery's .each signature from fn.call( dom_elem, i, dom_elem ) to fn.call( dom_elem, i, jq_object ) would be acceptable, but that's obviously not my call.

Owner

cowboy commented Aug 2, 2010

Ok, major correction.. this is going to be WAY slower than the core .each in scenarios where the user doesn't need a jQuery object inside the callback... so it should definitely be a separate method. See http://jsperf.com/jquery-each-vs-quickeach/2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment