Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 传递迭代变量以单击for循环内部的事件_Javascript - Fatal编程技术网

Javascript 传递迭代变量以单击for循环内部的事件

Javascript 传递迭代变量以单击for循环内部的事件,javascript,Javascript,我有以下代码: var i = 0; for (var anchor in window.globals.html.anchors) { var value = window.globals.html.anchors[anchor]; value.addEventListener('click', function(i) { var currData = window.globals.data[i], data_clientId

我有以下代码:

var i = 0;
for (var anchor in window.globals.html.anchors) {
     var value = window.globals.html.anchors[anchor];
     value.addEventListener('click', function(i) {
          var currData = window.globals.data[i],
              data_clientId = 0;
          if (currData.client_product_id !== undefined) {
              data_clientId = currData.getAttribute('data_clientId');
          } else if (currData.product_id !== undefined) {
              data_clientId = currData.product_id;
          }
          Statistics.send(data_clientId);
          window.open(window.globals.data[i].url, '_blank');
     }(i));
     i++;
}
这意味着我想通过点击事件监听器中的interator访问全局数组。如果我没有将no
I
传递给click事件,我将获得每个迭代中可能的最大数量,因为
I
将是一个全局变量

var i = 0;
for (var anchor in window.globals.html.anchors) {
   var value = window.globals.html.anchors[anchor];
   value.addEventListener('click', (function(i) {
     return function() {
        var currData = window.globals.data[i],
            data_clientId = 0;
        if (currData.client_product_id !== undefined) {
            data_clientId = currData.getAttribute('data_clientId');
        } else if (currData.product_id !== undefined) {
            data_clientId = currData.product_id;
        }
        Statistics.send(data_clientId);
        window.open(window.globals.data[i].url, '_blank');
     }
   }(i)));
   i++;
}
但就在这里,似乎所有单击事件的迭代都是在单击任何内容之前调用的,即onload


为什么会这样,出了什么问题?

看起来您正在调用处理程序,同时试图将其添加到
addEventListener
。您需要将其封装在函数中,从而创建一个封装
i
变量的闭包

var i = 0;
for (var anchor in window.globals.html.anchors) {
   var value = window.globals.html.anchors[anchor];
   value.addEventListener('click', (function(i) {
     return function() {
        var currData = window.globals.data[i],
            data_clientId = 0;
        if (currData.client_product_id !== undefined) {
            data_clientId = currData.getAttribute('data_clientId');
        } else if (currData.product_id !== undefined) {
            data_clientId = currData.product_id;
        }
        Statistics.send(data_clientId);
        window.open(window.globals.data[i].url, '_blank');
     }
   }(i)));
   i++;
}

现在请注意,传递给
addEventListener
的函数将立即被调用,并返回变量
i
作用域所在的函数本身。

看起来您正在调用处理程序,同时试图将其添加到
addEventListener
。您需要将其封装在函数中,从而创建一个封装
i
变量的闭包

var i = 0;
for (var anchor in window.globals.html.anchors) {
   var value = window.globals.html.anchors[anchor];
   value.addEventListener('click', (function(i) {
     return function() {
        var currData = window.globals.data[i],
            data_clientId = 0;
        if (currData.client_product_id !== undefined) {
            data_clientId = currData.getAttribute('data_clientId');
        } else if (currData.product_id !== undefined) {
            data_clientId = currData.product_id;
        }
        Statistics.send(data_clientId);
        window.open(window.globals.data[i].url, '_blank');
     }
   }(i)));
   i++;
}
现在请注意,您要传递给
addEventListener
的函数将立即被调用,并返回一个函数本身,其中变量
i
的作用域为。

可能重复的可能重复的可能重复的可能重复的