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访问全局数组。如果我没有将noI
传递给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
的作用域为。可能重复的可能重复的可能重复的可能重复的