如何冻结函数's在闭包中的变量

How do I freeze a function's variables in a closure?

本文关键字:闭包 变量 何冻结 冻结 函数      更新时间:2023-09-26

我正在开发一个支持重复出现的日历,因此,当有人在某一天选中某个活动的"完成"复选框时,它会隐藏当天的活动实例,而不影响其他活动。

实际可见的行为是,当有人选中任何复选框时,它会删除该活动最后一天的实例,我很确定这是因为函数正在访问闭包中循环的最新变量,而不是运行时这些变量所持有的值。相关代码片段为:

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函数访问创建时的变量,而不是退出循环时的变量的最佳选项是什么?

谢谢,

u在ur代码中没有使用任何闭包。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)