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