Thanks for your help Per, I've revisited this and can't recreate the
bug, so I must have reported it incorrectly.
I expect JavaScript scope still works as you understood it!
Also yes, $$ is proving to be a boon vs. getElementsByTagAndClassName
etc.

On Dec 3, 6:59 pm, "Per Cederberg" <[EMAIL PROTECTED]> wrote:
> To me it seems both version should work equally well. Each function
> scope created should be linked together, causing the "my_var" variable
> lookup to be found in the outer function when not defined in the local
> function scope. Unless I've misunderstood something about variable
> scoping in JavaScript.
>
> On the other hand, it looks like you are just filtering elements by
> tag name, class andattributevalue. Wouldn't it be nice to just use 
> aselectorinstead?
>
>   connect(el, 'onclick', function (e) {
>       var my_var = getNodeAttribute(e.src(), 'someattr');
>       forEach($$("div.some_class[someattr='" + my_var + "']"), 
> function(mydiv) {
>           // do something
>       }
>   });
>
> Cheers,
>
> /Per
>
> On Wed, Dec 3, 2008 at 4:18 PM, Eoghan <[EMAIL PROTECTED]> wrote:
>
> > I commonly use forEach within another function, like the following
> > example:
>
> >    connect(el, 'onclick', function(e){
> >        var my_var = getNodeAttribute(e.src(), 'someattr');
> >        forEach(getElementsByTagAndClassName('div', 'some_class'),
> > function(mydiv){
> >            if(getNodeAttribute(mydiv, 'someattr') == my_var){
> >                 // do something
> >            }
> >        }
> >    });
>
> > Unfortunately 'my_var' takes on unexpected values, because the
> > function that acts as the body of the forEach is a closure (I think).
> > Converting the above code to use a plain old 'for' loop acts as
> > expected:
>
> >    connect(el, 'onclick', function(e){
> >        var my_var = getNodeAttribute(e.src(), 'someattr');
> >        var arr = getElementsByTagAndClassName('div', 'some_class');
> >        for(var i=0; i<arr.length; i++){
> >            var mydiv = arr[i];
> >            if(getNodeAttribute(mydiv, 'someattr') == my_var){
> >                 // do something
> >            }
> >        }
> >    });
>
> > Using a partial function for the forEach body with 'my_var'
> > preinitialised seems clunky to me and definitely reduces readability.
> > What is the most elegant way to make forEach behave as expected (as
> > illustrated by the second example)?
>
> > Thanks!
>
> > Eoghan
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"MochiKit" group.
To post to this group, send email to mochikit@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/mochikit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to