我有以下代码:
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++;
}
这意味着我想通过click事件监听器内的interator访问全局数组。如果我没有将i
传递给click事件,我会在每次迭代中获得最大数量,因为i
将是一个全局变量。
但是在这里似乎点击事件的所有迭代都是在点击任何东西之前调用的,onload。
为什么会这样,有什么不对?
答案 0 :(得分:0)
在尝试将处理程序添加到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
是作用域。