Javascript 如何修复在for循环中使用onclick事件时的范围问题

Javascript 如何修复在for循环中使用onclick事件时的范围问题,javascript,for-loop,scope,onclick,Javascript,For Loop,Scope,Onclick,我目前在for循环中实现onclick事件时遇到困难。它总是返回未定义的值,而不是警告相应的值(可能是范围问题,因为迭代本身工作正常) 直到现在,我一直试图将I变量传递给onclick函数;但收效甚微 for (var i = 0; i < timeSpanLength; i++) { // creating the wrap for the month var month = document.createElement("div");

我目前在for循环中实现onclick事件时遇到困难。它总是返回未定义的值,而不是警告相应的值(可能是范围问题,因为迭代本身工作正常)

直到现在,我一直试图将I变量传递给onclick函数;但收效甚微

for (var i = 0; i < timeSpanLength; i++) {
            // creating the wrap for the month
            var month = document.createElement("div");
            month.className = 'month_element';

            var reference_month = document.createElement("span");
            reference_month.innerHTML = time_span[i];

            //onclick event
            reference_month.onclick = function(i) {
                var month_beginning = signup_date;
                var month_end = time_span[i];
                alert(month_end);
                //searchForData(month_beginning, month_end);
            };

            //append to container
            month.appendChild(reference_month);
            document.getElementById('time_container').appendChild(month);
        }
for(变量i=0;i
预期结果是触发一个警报,该警报显示与上面span元素中显示的月份相同的月份。我需要变量将其传递给另一个函数

非常感谢您的帮助,因为我是javascript的初学者。

for(var I=0;Ifor (var i = 0; i < timeSpanLength; i++) {
 (function (index) {
   // creating the wrap for the month
            var month = document.createElement("div");
            month.className = 'month_element';

            var reference_month = document.createElement("span");
            reference_month.innerHTML = time_span[index];

            //onclick event
            reference_month.onclick = function() {
                var month_beginning = signup_date;
                var month_end = time_span[index];
                alert(month_end);
                //searchForData(month_beginning, month_end);
            };

            //append to container
            month.appendChild(reference_month);
            document.getElementById('time_container').appendChild(month);
 })(i);
}
(功能(索引){ //创建月份的换行符 var月=document.createElement(“div”); month.className='month_element'; var reference_month=document.createElement(“span”); reference_month.innerHTML=time_span[index]; //onclick事件 reference\u month.onclick=函数(){ var月\开始=注册日期; var月底=时间跨度[指数]; 警报(月底); //searchForData(月初、月底); }; //附加到容器 月。追加子项(参考月); document.getElementById('time_container').appendChild(月); })(i) ); }
此回调函数处理程序正在形成外部作用域的闭包。此外,
var
还有一个功能范围,因此本质上代码块可以重写为:

var i;
for (i = 0; i < timeSpanLength; i++) {
  ...
  //onclick event
  reference_month.onclick = function(i) {
            var month_beginning = signup_date;
            var month_end = time_span[i];
            alert(month_end);
            //searchForData(month_beginning, month_end);
   };
   ...
}
或形成一个新范围的IIFE,该范围绑定到循环中
i
的每个新值:

for (var i = 0; i < timeSpanLength; i++) { 
   (function(i){
      reference_month.onclick = function(i) {
            var month_beginning = signup_date;
            var month_end = time_span[i];
            alert(month_end);
            //searchForData(month_beginning, month_end);
       };
    })(i) 
}
for(var i=0;i
而不是
var i=0使用
设i=0
reference\u month.onclick=function(i)
@非常感谢!此外,我还必须从onclick函数中删除I
for (var i = 0; i < timeSpanLength; i++) { 
   (function(i){
      reference_month.onclick = function(i) {
            var month_beginning = signup_date;
            var month_end = time_span[i];
            alert(month_end);
            //searchForData(month_beginning, month_end);
       };
    })(i) 
}