Cierre en Javascript

Posible duplicado:
Pasar valores a onclick

Tengo 100 elementos con ids divNum0 , …, divNum99 . Cada vez que se hace clic debe llamar a doTask con el parámetro correcto.

El código siguiente desafortunadamente no cierra i, y por doTask tanto se llama a doTask con 100 para todos los elementos.

 function doTask(x) {alert(x);} for (var i=0; i<100; ++i) { document.getElementById('divNum'+i).addEventListener('click',function() {doTask(i);},false); } 

¿De alguna manera puedo hacer que la función se llame con los parámetros correctos?

Aunque la respuesta (correcta) es la duplicada , me gustaría señalar un método más avanzado: reemplazar los bucles con iteradores, lo que soluciona de forma efectiva el problema de cierres “de destino tardío” de JavaScript.

 loop = function(start, end, step, body) { for(var i = start; i != end; i += step) body(i) } loop(1, 100, 1, function(i) { // your binding stuff }) 

Crear un cierre a través de un literal de función autoejecutable (o una función de fábrica nombrada)

 function doTask(x) { alert(x); } for(var i = 100; i--;) { document.getElementById('divNum' + i).onclick = (function(i) { return function() { doTask(i); }; })(i); } 

o use el nodo DOM para almacenar información

 function doTask() { alert(this.x); } for(var i = 100; i--;) { var node = document.getElementById('divNum' + i); node.x = i; node.onclick = doTask; } 

Este último es más amigable con la memoria ya que no se crean objetos de función superfluos.