我没什么问题。我正在使用一个公司的API。我请求活动,他们返回我的一系列活动。这是代码的一部分。
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('<div class="Game-Screen-Footer-Adv" id="foota'+i+'"><a href="javascript:;" ><img src="'+activity.image_url+'" alt="'+activity.display_text+'" width="190" height="110"></a></div>');
document.getElementById('foota'+i+'').onclick = function() {
ARNO.box.show({html:'<div id="socialVibeFancyBox0"></div>', close: false, width:activity.window_width, height:activity.window_height, openjs:
function(){
client.loadActivityIntoContainer(activity, 'socialVibeFancyBox0');
}
});
}
}
}
大多数情况下,此函数返回包含3个元素的数组。但是当我点击第一个活动时,onStart它应该提醒我(0开始),但是它会发出警报(4开始),这意味着它会警告我的最后一个元素。我该怎么解决这个问题?我尝试了很多东西,但我找不到解决办法,也许你可以帮助我?
答案 0 :(得分:5)
这是关闭问题的另一个例子。试试这个:
for( i=0; i<activities.length; i++) {
(function(i) {
// your code here
})(i);
}
答案 1 :(得分:0)
将for
循环的内容移到函数中,并传递需要单独作用域的值。
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:'<div id="socialVibeFancyBox0"></div>',
close: false, width:activity.window_width,
height:activity.window_height,
openjs:function(){
client.loadActivityIntoContainer(activity, 'socialVibeFancyBox0');
}
});
}
函数调用会创建一个新的变量范围。在函数中创建的任何变量或参数都在它们自己的范围内,并且在同一范围内创建的函数将永久引用这些变量。
答案 2 :(得分:0)
如果你不关心IE8-那么ES5已经用forEach
解决了这个问题:
activities.forEach(function(v, i){
// now 'i' will work anywhere within this scope
});