I just tried this and Henry's right... assigning it within the closure
doesn't make any difference.

Does anyone know of an efficient approach to accomplishing what I'm
trying to do, assigning a different click handler per page number?

Perhaps I could access the text inside the local span (1, 2, 3, 4,
5...) and use that as my variable? If that works, how would I do that?

Thanks!

On Jul 25, 5:22 am, Henry <[EMAIL PROTECTED]> wrote:
> On Jul 25, 3:17 am, Karl Rudd wrote:
>
>
>
> > The "i" in the click function (closure) is just a reference
> > to the "i" outside. That "i" changes with each iteration of
> > the for loop.
>
> > If you want to save a copy of the value of "i" then create
> > a _local_ var _inside_ the closure and assign it the
> > value of "i".
>
> > For example:
>
> > for (var i = 1; i < totalPages + 1; i++) {
> >   $("#pages_panel").append($("<span> " + i + "</span>")
> >     .click(function() { var saved = i; pageClicked(saved);
> > console.log("i:" + saved); }));
>
> > }
>
> How is that going to help? Executing - saved = i - inside the function
> is still going to reference the - i - variable from the containing
> scope, and so assign whatever value it has at the time of assignment,
> which will still be after the containing loop has finished and so
> after - i - has been assigned a value greater than - totalPages -.
>
> A more viable approach (though far from efficient as it creates two
> function object for each iteration of the loop) would be to replace
> the inner function with the inline execution of a function expression
> that returned the inner function, passing in the current value of - i
> - as an argument to the function call, and allowing the returned
> function to reference the value at that point via the outer function's
> formal parameter. I.E.:-
>
> for (var i = 1; i < totalPages + 1; i++) {
>   $("#pages_panel").append($("<span> " + i + "</span>")
>     .click(
>            (function(x){
>              return (function(){
>                pageClicked(x);
>                console.log("i:" + x);
>              });
>            })(i)
>     )
>   );
>
> }
> > Closures are tricky constructions till you get used to them.
>
> Yes, but understanding is worth more than familiarity.
>
> <URL:http://jibbering.com/faq/faq_notes/closures.html>

Reply via email to