我循环浏览一些元素,然后添加新元素,这些元素在单击时应该操纵这些元素。这很难解释,所以请看看这个小提琴,让它更清晰:
有趣的部分是这段代码(为了简洁起见,伪代码):
for (var i = 0; i < divs.length; i++) {
var div = divs[i];
someOtherElement.addEventListener("click", function () {
testDiv(div); // always refers to the last div because variable is overwritten next loop
});
}
我希望testDiv调用分别引用div 1,div 2,div 3,但是它们都引用div 3,因为变量在下一个循环迭代中被覆盖。我该如何解决这个问题?
答案 0 :(得分:5)
这是一个经典问题。以下是它通常如何解决的问题:
for (var i = 0; i < divs.length; i++) {
(function(div){
someOtherElement.addEventListener("click", function () {
testDiv(div);
});
})(divs[i]);
}
要理解问题和解决方案,您必须知道JavaScript中非全局变量的范围是对声明它的函数的调用。这意味着
div
变量div
变量答案 1 :(得分:2)
这是解决问题的另一种方式......
function testDiv(d) {
// this doesn't work as expected, it always shows "Div 3"
alert(d.innerText);
}
var divs = document.getElementsByTagName("div");
for (var i = 0; i < divs.length; i++) {
var div = divs[i];
var a = document.createElement("a");
a.index = i;
a.innerText = "[this should point to Div" + (i+1) + "]";
a.href = "#";
a.addEventListener("click", function (e) {
var e = e || window.event;
var tg = e.target || e.srcElement;
testDiv(divs[tg.index]);
});
document.body.appendChild(a);
}