我正在制作一个支持重复出现的日历,因此预期的行为是,当有人在某一天检查一个活动的“完成”复选框时,它会隐藏当天的活动实例并使其他活动不受影响。< / p>
实际的,看到的行为是,当有人检查任何复选框时,它会删除该活动的最后一天的实例,我很确定这是因为函数正在访问闭包中循环的最新变量,而不是这些变量在运行时所持有的值。相关的代码段是:
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函数访问创建时的变量,而不是循环退出时,我有哪些最佳选择?
谢谢,
答案 0 :(得分:1)
你没有在你的代码中使用任何闭包。 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)