Connecting Tech Pros Worldwide Help | Site Map

closure problem

  #1  
Old March 6th, 2008, 04:55 PM
jman
Guest
 
Posts: n/a
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, 05:25 PM
Nick Fletcher
Guest
 
Posts: n/a

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, 10:05 PM
Thomas 'PointedEars' Lahn
Guest
 
Posts: n/a

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
Closed Thread


Similar Threads
Thread Thread Starter Forum Replies Last Post
function syntax question Csaba Gabor answers 7 April 12th, 2006 03:35 AM
A2K - Odd form closure problem - REPOST Deano answers 0 March 2nd, 2006 11:55 AM
A2k - odd form closure problem Deano answers 1 March 1st, 2006 10:46 AM
transitive closure of a graph Mikito Harakiri answers 9 November 12th, 2005 11:55 AM