0

What the best way to fix this problem with closure in jsavascript?

Here is I have simple problem:

10 spans and onclick event(I expect alert number of block on each click):

var spans = document.getElementsByTagName('span');

function addEvents(divs) {
    for(var i=0; i < divs.length; i++) {
        divs[i].innerHTML = i;
        divs[i].onclick = function() { alert(i) }
    }
}

addEvents(spans);

JSFiddle link.

FlashTrava
  • 119
  • 6

1 Answers1

1

Wrap it in a self-executing closure:

divs[i].onclick = (function(i) {
    return function() {
        alert(i);
    };
})(i);

To keep it shorter: define it as a callback:

var callback = function(i) {
    return function() { alert(i); };
};

divs[i].onclick = callback(i);
David G
  • 94,763
  • 41
  • 167
  • 253