Nick Fletcher wrote/zu Deiner Priorität-Alpha-1-Nachricht von Sternzeit
06.03.2008 18:16:
> On Mar 6, 8:54 am, jman <erjdri...@gmail.com> wrote:
>> 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
> 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