3

少し問題があります。私は 1 つの会社の 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 開始) が表示されます。これは、i の最後の要素を警告することを意味します。これを修正するにはどうすればよいですか? いろいろ試したのですが解決できませんでした、どなたか教えていただけないでしょうか?

4

3 に答える 3

5

これは、閉鎖の問題のもう 1 つのケースです。これを試して:

for( i=0; i<activities.length; i++) {
    (function(i) {
        // your code here
    })(i);
}
于 2012-10-03T23:27:41.780 に答える
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');
                }
            });
}

関数呼び出しにより、新しい変数スコープが作成されます。関数で作成されたすべての変数またはパラメーターは独自のスコープにあり、同じスコープで作成された関数はそれらの変数を永続的に参照します。

于 2012-10-03T23:30:31.700 に答える
0

IE8 を気にしない場合は、ES5 で既にこの問題が解決されていforEachます。

activities.forEach(function(v, i){
  // now 'i' will work anywhere within this scope
});
于 2012-10-03T23:32:45.657 に答える