Javascript onclick muestra el último elemento de la matriz con for loop

Tengo un pequeño problema. Estoy trabajando con las API de una compañía. Solicito actividades y me devuelven variedad de actividades. Aquí es parte del código.

client.requestActivities(function(activities) { if (activities.length > 0) { for(i=0; i < activities.length; i++) { var activity = activities[i]; activity.onStart(function() { alert(i+ " started"); }); activity.onCredit(function() { alert(i+ " credit"); }); activity.onClose(function() { alert(i+ " close"); }); activity.onFinish(function() { alert(i+ " finish"); }); $('.Game-Screen-Footer').append(''); document.getElementById('foota'+i+'').onclick = function() { ARNO.box.show({html:'
', close: false, width:activity.window_width, height:activity.window_height, openjs: function(){ client.loadActivityIntoContainer(activity, 'socialVibeFancyBox0'); } }); } }

}

Sobre todo, esta función devuelve el array con 3 elementos. Pero cuando hago clic en la primera actividad, en Inicio, debería alertarme (inicio 0), pero alerta (inicio 4), esto significa que alerta al último elemento de i. ¿Cómo debo arreglar esto? Intenté muchas cosas, pero no he encontrado una solución, ¿quizás puedas ayudarme?

Este es otro caso de problemas de cierre. Prueba esto:

 for( i=0; i 

Mueva las entrañas del for out a una función, y pase los valores que deben incluirse por separado.

 for(i=0; i < activities.length; i++) { setUpActivity(i, activities[i]); } 

 function setUpActivity(i, activity) { activity.onStart(function() { alert(i+ " started"); }); activity.onCredit(function() { alert(i+ " credit"); }); activity.onClose(function() { alert(i+ " close"); }); activity.onFinish(function() { alert(i+ " finish"); }); ARNO.box.show({ html:'
', close: false, width:activity.window_width, height:activity.window_height, openjs:function(){ client.loadActivityIntoContainer(activity, 'socialVibeFancyBox0'); } }); }

Una invocación de función crea un nuevo ámbito variable. cualquier variable o parámetro creado en la función estará en su propio scope, y las funciones creadas en el mismo scope tendrán una referencia permanente a esas variables.

Si no te importa IE8, ES5 ya soluciona este problema con forEach :

 activities.forEach(function(v, i){ // now 'i' will work anywhere within this scope });