我目前遇到一个问题,我在其中动态创建一组div,并在创建它们时向其分配一个onclick()事件。该代码的简化版本如下所示:

for(DayOfTheWeek = 0; DayOfTheWeek < 7; DayOfTheWeek++){
  var EventCell = document.createElement('div');
  var EventDayIndex = WeekNumber*7 + DayOfTheWeek + EventoDayOffset;
  EventCell.onclick = function(){ClickableDivFunction(EventDayIndex)};
}


我的问题是,我所有的div集都使用计算出的最终EventDayIndex的参数调用ClickableDivFunction。这就是我所有的7个div都执行ClickableDivFunction(6)而不是我的第一个div执行ClickableDivFunction(0),第二个div执行了ClickableDivFunction(1),依此类推。

在此论坛上搜索时,我发现以下answer解释了我的问题。基本上,EventDayIndex不仅会评估并保留为onclick事件定义的函数中每次迭代获得的值。

我尝试了几种方法,例如尝试将EventDayIndex转换为字符串,希望ClickableDivFunction的参数保持其值。尝试添加另一个变量,使用'+'运算符生成一个字符串,然后向ClickableDivFunction添加过滤器以删除多余的文本(这是我试图通过执行以下操作来强制对EventDayIndex进行评估:

var NewVar = ClickableDivFunction + "#";


然后在调用函数中删除“#”。)在所有情况下,我都得到相同的结果。
所以我的问题是,你们如何建议以安全,可维护的方式解决此问题?我以为人们过去会遇到这个问题,而我只是在编程方面没有足够的知识来知道要搜索什么,但是我认为可以解决该问题的所有事情要么是投射到文本上,要么是找到一个通过值进行变量赋值的方法。

希望对此有所帮助或提供答案的链接。

最佳答案

JavaScript按函数对变量进行范围划分,而不像您通常那样按循环或块进行范围划分。因此,如果您想为每个div分配一个单独的变量,则需要一个单独的函数调用。

for(DayOfTheWeek = 0; DayOfTheWeek < 7; DayOfTheWeek++){
  createEventCell(WeekNumber*7 + DayOfTheWeek + EventoDayOffset);
}

function createEventCell(EventDayIndex) {
  var EventCell = document.createElement('div');
  EventCell.onclick = function() { ClickableDivFunction(EventDayIndex); };
}


这是不同的,因为对createEventCell的每次调用都有其自己的作用域(这是您希望在原始代码中的每个循环中发生的情况)。

JavaScript使创建新函数并传递它们变得非常容易,因此最终并没有一开始看起来那么麻烦,并且您可能会注意到代码变得更小,更紧凑且更有趣。当您更熟悉该语言时,请查看underscore.js。

10-04 22:32