3

Possible Duplicate:
Javascript infamous Loop problem?

For some reason I get "6" inside my function here for every div element:

for(var i = 1; i <= 5; i++){
  $('<div class="e-' + i + '"></div>').appendTo(something).click(function(){
    alert(i);  // <-- it's 6. wtf??
  });
}

instead of 1, 2, 3, etc.

The class on the other hand it appears to be correctly set..

What am I doing wrong?

2

2 Answers 2

10

Your for loop is being executed at page load time. The alert only fires when there's a click event which is happening after the for loop has finished. Hence the value of i is now 6.

1) Page loads, for loop does its stuff...

2) Sometime later a click event is fired. the value of i at this time is 6 because the forloop has already completed.

Sign up to request clarification or add additional context in comments.

Comments

5

The problem is that you need to create a closure to capture the value of i at the time you bind the click function.

Try this:

for(var i = 1; i <= 5; i++)
{
  $('<div class="e-' + i + '"></div>')
    .appendTo(something)
    .click(function(value)
    { 
      return function() { alert(value) };
    }(i));
}

5 Comments

Why not use an anonymous function? It looks better.
also the var fn inside the loop is misleading as there is no block scope in js.
Cool, didn't know about the lack of block scope. Either way, my unedited answer works fine.
Eww! I prefer to do it cleaner still: for(var i = 1; i <= 5; i++){createWidget(i);} and move the entire jQuery statement into createWidget or whatever. Why create an anonymous function every iteration?
Why create an anonymous function every iteration? You do that to capture the value of i each time. That's what a closure does.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.