Thank you very much guys. Your suggestions worked for me.

@ T.J.
You explanations were very insightful. I think that I understand
javascript a little better now, thank you.

On May 16, 4:33 am, "T.J. Crowder" <[EMAIL PROTECTED]> wrote:
> Hi,
>
> Both Ken and kangax have answered the practical question you posed,
> but you're probably wondering why your code didn't work. :-)  It's
> because in this line of code:
>
> > item.onclick = function(){fc.selectArticle(id,headline);};
>
> ...you're assuming that 'id' and 'headline' become fixed at that point
> in time, that you're burning their *values* into the closure function
> (the onclick handler) at the point the function is defined.  That's
> not how closures work.  They work by giving the function enduring
> *access* to the things in scope where it's defined.  So for instance:
>
> function chatter()
> {
>     var closures;
>     var i;
>     var msg;
>     var closure;
>
>     closures = [];
>     for (i = 1; i <= 5; ++i)
>     {
>         msg = "This is message #" + i;
>         closures.push(function() { alert(msg); });
>     }
>
>     for (i = 0; i < closures.length; ++i)
>     {
>         closure = closures[i];
>         closure();
>     }
>
> }
>
> This *doesn't* show five alerts saying "This is message #1", "This is
> message #2", etc.  It shows five alerts saying "This is message #5",
> because the functions access the 'msg' variable dynamically when
> they're *called*, and by the time they're called, msg is "This is
> message #5".  This is incredibly powerful, but can be a bit surprising
> when you first look at it, especially when the closure lives on after
> the function returns and you think that the local vars have
> disappeared (they haven't, the closure preserves them).  So this works
> the same way and has the same result:
>
> function chatter()
> {
>     var closures;
>
>     closures = createChatter();
>     doChatter(closures);}
>
> function createChatter()
> {
>     var closures;
>     var i;
>     var msg;
>
>     closures = [];
>     for (i = 1; i <= 5; ++i)
>     {
>         msg = "This is message #" + i;
>         closures.push(function() { alert(msg); });
>     }
>
>     return closures;}
>
> function doChatter(closures)
> {
>     var closures;
>     var i;
>     var closure;
>
>     for (i = 0; i < closures.length; ++i)
>     {
>         closure = closures[i];
>         closure();
>     }
>
> }
>
> Note that the 'msg' variable lives even though createChatter() has
> returned; each closure keeps a reference to the scope where it was
> defined, and so that scope is preserved in memory even when it would
> have been released if there were no closures involved.  (The other
> local vars to createChatter() also live on; but nothing uses them, so
> that's just wasted space.)
>
> More on closures in my blog (which sadly I haven't had time to post to
> lately):http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.htmlhttp://blog.niftysnippets.org/2008/03/closures-by-example.html
>
> This post may also be 
> useful:http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html
> ...as you have an implicit global variable 'i' in your code which you
> almost certainly intended to be local to your "result" function. ;-)
>
> Hope this helps,
> --
> T.J. Crowder
> tj / crowder software / com
>
> On May 15, 10:57 pm, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]>
> wrote:
>
> > Hi all,
> > I am having trouble with my variable assignments always becoming the
> > last variable inside my loop.
>
> >                 var populateAvailableContent = Class.create(methodCall, {
> >                         initialize: function($super, name, message) {
> >                                 $super(name,'getAllContent','Loading...')
> >                         },
> >                         result: function(ret) {
> >                                 var div = $('articles');
> >                                 div.innerHTML = null;
> >                                 var rowCount = ret.getRowCount();
> >                                 for (i=0;i<rowCount;i++) {
> >                                         var item = 
> > document.createElement('div');
> >                                         var id = ret.id[i]
> >                                         var headline = ret.headline[i];
> >                                         var html = headline + "<hr />";
> >                                         item.id = "item";
> >                                         item.onclick = 
> > function(){fc.selectArticle(id,headline);};
> >                                         item.innerHTML = html;
> >                                         div.appendChild(item);
> >                                 }
> >                         }
> >                 })
>
> > In this scenario, id and headline are always becomes the last value in
> > the loop and that is what is passed in the fc.selectArticle()
> > function. I've tried a few different possible solutions I've found on
> > the web, but none seemed to work. I decided to try and give the bind()
> > function a go around but I can't seem to figure out how to use it in
> > my situation.
>
> > Any help would be greatly appreciated.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Spinoffs" 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/rubyonrails-spinoffs?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to