如何在JavaScript中更改干扰所需结果的闭包?

如何在JavaScript中更改干扰所需结果的闭包?,javascript,closures,Javascript,Closures,我有一个基本的闭包/“使用闭包”JavaScript问题 在一个函数和两个for循环中,我有一个Ajax调用,我想用一个等于它在循环中的变量进行调用。matches_date被设置为JavaScript日期,并带有一个自定义修改的setTime(),每次通过循环时都会有所不同。在内部循环中,我有: jQuery('.hide-instance').click(function(event) { jQuery.ajax('/save/hide/instance', {'complete':

我有一个基本的闭包/“使用闭包”JavaScript问题

在一个函数和两个for循环中,我有一个Ajax调用,我想用一个等于它在循环中的变量进行调用。matches_date被设置为JavaScript日期,并带有一个自定义修改的setTime(),每次通过循环时都会有所不同。在内部循环中,我有:

jQuery('.hide-instance').click(function(event)
  {
  jQuery.ajax('/save/hide/instance', {'complete': function()
    {
    jQuery.ajax('/load/calendar', {'complete':
      DASHBOARD.load_calendar_from_ajax, 'type': 'POST'});
    }, 'data':
    {
    'id': element.id,
    'date': matches_date.toDateString()
    }, 'type': 'POST'});
  });
可以预见的是,这会导致隐藏实例复选框调用散列中带有“date”的函数,该函数等于循环中最后一个值matches_date的最后一次调用toDateString()的最后一次运行

我尝试将匹配项\u date.toDateString()复制到函数前面声明的变量,但效果不一样

如何更改代码,使字典中的“date”被定义为循环迭代的toDateString()值填充

--编辑--

上面引用的调用位于函数中的两个嵌套循环内:

DASHBOARD.load_calendar = function(json)
  {
  console.log('Loading calendar...');
  DASHBOARD.calendar_entries = JSON.parse(json);
  var last_unique_event = 0;
  var is_unique = false;
  var last_day_displayed = '';
  jQuery('#display').html('');
  for(var days_difference = 0; days_difference - last_unique_event <
    DASHBOARD.calendar_days; ++days_difference)
    {
    var matches_date = new Date();
    matches_date.setTime(matches_date.getTime() + days_difference * 24 * 60 *
      60 * 1000);
    for(var index = 0; index < DASHBOARD.calendar_entries.length; ++index)
      {
DASHBOARD.load\u calendar=function(json)
{
log('正在加载日历…');
DASHBOARD.calendar_entries=JSON.parse(JSON);
var last_unique_事件=0;
var是唯一的=错误;
显示的最后一天变量=“”;
jQuery('#display').html('');
对于(变量天数差异=0;天数差异-上次唯一事件)<
DASHBOARD.calendar_天;++天_差)
{
var匹配_date=新日期();
匹配\u date.setTime(匹配\u date.getTime()+天\u差*24*60*
60 * 1000);
对于(var索引=0;索引
另外,我看到了一种在我自己构建的代码上使用eval()的方法,因此它不会在不受信任的代码上使用eval(),但作为一种规则,如果我看到的唯一方法是使用eval(),那么99%的时间都是试图找到正确方法的线索。

通过添加一个闭包:

for(...){
  var matches_date = ...
  (function(matches_date){  //This line does the magic!    
    jQuery('.hide-instance').click(function(event)
      {
      jQuery.ajax('/save/hide/instance', {'complete': function()
        {
        jQuery.ajax('/load/calendar', {'complete':
          DASHBOARD.load_calendar_from_ajax, 'type': 'POST'});
        }, 'data':
        {
        'id': element.id,
        'date': matches_date.toDateString()
        }, 'type': 'POST'});
      });
  })(matches_date);  //This one, too
}
由于javascript变量的作用域是函数级的,因此我们在循环中添加了一个函数(闭包),该函数有自己的
matches_date
var(作为参数)。这样,变量就不会被共享,每个循环都有自己的副本,因此不会被覆盖


干杯,来自玻利维亚拉巴斯

@EdgarVillegasAlvarado谢谢;参见编辑的帖子。太好了。我用解决方案添加了答案;)可能重复