1

私は繰り返し発生をサポートするカレンダーに取り組んでいるので、ある日の1つのアクティビティの[完了]チェックボックスをオンにすると、その日のアクティビティのインスタンスが非表示になり、他のインスタンスは変更されないままになります。

実際に見られる動作は、誰かがチェックボックスをオンにすると、そのアクティビティの最終日のインスタンスが削除されることです。これは、関数がクロージャー内のループの最新の変数にアクセスしているためであり、実行時にこれらの変数によって保持された値。関連するコードスニペットは次のとおりです。

for(var index = 0; index < elements.length; ++index)
    {
    var split_id = elements[index].id.split('_');
    var id = Number(split_id[1]);
    var day = split_id[2];
    var date = split_id[3];
    var month = split_id[4];
    var year = split_id[5];
    elements[index].onclick = function()
        {
        alert(id + '_' + day + '_' + date + '_' + month + '_' + year);
        if (calendar[id][2].indexOf(id + '_' + day + '_' + date + '_' + month + '_' + year) === -1)
            {
            calendar[id][2][calendar[id][2].length] = id + '_' + day + '_' + date + '_' + month + '_' + year;
            }
        save_all();
        update_calendar_display();
        }
    }

ループが終了したときではなく、onclick関数が作成されたときに持っていた変数にアクセスするための私の最良のオプションは何ですか?

ありがとう、

4

1 に答える 1

1

uコードでクロージャを使用しませんでした。forループはスコープを定義しません。これを試して

function clickFunction(id, date, day, month, year) {  
        return function() {
          alert(id + '_' + day + '_' + date + '_' + month + '_' + year);
          if (calendar[id][2].indexOf(id + '_' + day + '_' + date + '_' + month + '_' + year) === -1) {
              calendar[id][2][calendar[id][2].length] = id + '_' + day + '_' + date + '_' + month + '_' + year;
            }
          save_all();
          update_calendar_display();  
        }  
}

それから

elements[index].onclick = clickFunction(id, date, day, mo)
于 2012-09-03T19:30:24.700 に答える