Connecting Tech Pros Worldwide Help | Site Map

closure problem

 
LinkBack Thread Tools Search this Thread
  #1  
Old March 6th, 2008, 03:55 PM
jman
Guest
 
Posts: n/a
Default closure problem

for ( var i = 0; i < div.firstChild.childNodes.length; ++i )
{
var marker = new Object();
marker.iii = i;

sys.addListener( marker, "click", function()
{
alert(marker.iii);
});
}

looks like when clicked - marker object has the value of the last
object thru the loop.

i'd like it to display the appropriate iii value.

  #2  
Old March 6th, 2008, 04:25 PM
Nick Fletcher
Guest
 
Posts: n/a
Default Re: closure problem

On Mar 6, 8:54 am, jman <erjdri...@gmail.comwrote:
Quote:
for ( var i = 0; i < div.firstChild.childNodes.length; ++i )
{
var marker = new Object();
marker.iii = i;
>
sys.addListener( marker, "click", function()
{
alert(marker.iii);
});
}
>
looks like when clicked - marker object has the value of the last
object thru the loop.
>
i'd like it to display the appropriate iii value.
JavaScript has function level scoping as opposed to block level (like
other languages). Your marker object is visible across iterations and
the closure will always reference the last instance of the marker
object. I believe you could stop this from happening using a self-
executing anonymous function, like so:

for ( var i = 0; i < div.firstChild.childNodes.length; ++i )
{
(function() {
var marker = new Object();
marker.iii = i;

sys.addListener( marker, "click", function()
{
alert(marker.iii);
});
})(); /* These brackets are necessary to execute the anonymous
function */
}

This should scope the marker inside the anonymous function and the
closure should behave the way you want.
  #3  
Old March 7th, 2008, 09:05 PM
Thomas 'PointedEars' Lahn
Guest
 
Posts: n/a
Default Re: closure problem



Nick Fletcher wrote/zu Deiner Priorität-Alpha-1-Nachricht von Sternzeit
06.03.2008 18:16:
Quote:
On Mar 6, 8:54 am, jman <erjdri...@gmail.comwrote:
Quote:
> for ( var i = 0; i < div.firstChild.childNodes.length; ++i )
> {
> var marker = new Object();
> marker.iii = i;
>>
> sys.addListener( marker, "click", function()
> {
> alert(marker.iii);
> });
> }
>>
>looks like when clicked - marker object has the value of the last
>object thru the loop.
>>
>i'd like it to display the appropriate iii value.
>
JavaScript has function level scoping as opposed to block level (like
other languages).
JFYI: Since version 1.7 it also has block scoping, but you need to declare
that version as it introduces new keywords.

http://developer.mozilla.org/en/docs...scope_with_let
Quote:
Your marker object is visible across iterations and
the closure will always reference the last instance of the marker
object. I believe you could stop this from happening using a self-
executing anonymous function, like so:
>
for ( var i = 0; i < div.firstChild.childNodes.length; ++i )
{
(function() {
var marker = new Object();
marker.iii = i;
>
sys.addListener( marker, "click", function()
{
alert(marker.iii);
});
})(); /* These brackets are necessary to execute the anonymous
function */
}
>
This should scope the marker inside the anonymous function and the
closure should behave the way you want.
You create an additional closure of `i' needlessly. It is overkill
and the base code is still very inefficient and error-prone.

Consider this instead:

for (var i = 0, len = div.firstChild.childNodes.length; i < len; ++i)
{
var marker = new Object();
marker.iii = i;

sys.addListener(
marker, "click",
(function(me) {
return function() {
window.alert(me.iii);
};
})(marker)
);
}


PointedEars
--
var bugRiddenCrashPronePieceOfJunk = (
navigator.userAgent.indexOf('MSIE 5') != -1
&& navigator.userAgent.indexOf('Mac') != -1
) // Plone, register_function.js:16
 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,662 network members.