我读过可以在循环(addEventListener using for loop and passing values)中为addEventListener使用闭包。
但是,此方法不适用于更复杂的示例:
function f(fevent) {
var a = document.createElement('a');
a.innerHTML = 'Test';
a.href = '#';
a.addEventListener('click', fevent);
return a;
};
for (l = 0; l < 2; l += 1) {
for (h = 0; h < 2; h += 1) {
document.body.appendChild(
f(function() {alert(l+','+h);})
);
}
}
https://jsfiddle.net/yasnujzq/
编辑:我想要的是锚点上的点击事件提醒不同的组合(0,0),(1,0),(0,1)和(1,1) 。但它始终警告(2,2)。
以下是我尝试使用上面的闭包方法:
function f(fevent) {
var a = document.createElement('a');
a.innerHTML = 'Test';
a.href = '#';
a.addEventListener('click', fevent);
return a;
};
for (l = 0; l < 2; l += 1) {
for (h = 0; h < 2; h += 1) {
(function() {
document.body.appendChild(
f(function() {alert(l+','+h);})
);
}());
}
https://jsfiddle.net/72sg8d5n/
我还尝试在闭包中添加参数:
function f(fevent) {
var a = document.createElement('a');
a.innerHTML = 'Test';
a.href = '#';
a.addEventListener('click', fevent);
return a;
};
for (l = 0; l < 2; l += 1) {
for (h = 0; h < 2; h += 1) {
(function() {
document.body.appendChild(
f(function() {alert(l+','+h);})
);
}(l,h));
}
}
https://jsfiddle.net/wxodr8p6/
也许有人可以就此启发我。
编辑:以下是接受的解决方案中的方法:
答案 0 :(得分:3)
(function() { document.body.appendChild( f(function() {alert(l+','+h);}) ); }(l,h));
在这段代码的最后一行,你传递了两个参数。
在第一行,您不接受任何参数。
您不使用传递给该函数的值,您仍在使用循环中的值(每次循环时都会更改)。
(function(my_l, my_h) {
document.body.appendChild(
f(function() {alert(my_l+','+my_h);})
);
}(l,h));