我想在testdome上解决这个公开提问的问题。每个as[i]
应该是alert(i)
的函数。
要修复错误的代码是:
function registerHandlers() {
var as = document.getElementsByTagName('a');
for (i = as.length; i-- >= 0;) {
as[i].onclick = function() {
alert(i);
return false;
}
}
}
我尝试的解决方案是:
function registerHandlers() {
var as = document.getElementsByTagName('a');
//made the loop variables more explicit
for (i = as.length-1; i >=0; i--) {
var x = i;
as[x].onclick = function() {
alert(x);
return false;
}
}
}
我虽然变量i
是持久的,但我将其副本保留在变量x中,并使用变量x
而不是i
。但它并没有完全解决问题。请让我知道我的误解是什么。
答案 0 :(得分:5)
您的i
和x
值在完全相同的范围内声明,因此在执行函数时x
将是其最终值。您可以创建一个这样的闭包:
function registerHandlers() {
var links = document.getElementsByTagName('a');
for (var i = 0, len = links.length; i < len; i += 1) {
links[i].onclick = generateHandler(i);
}
function generateHandler (index) {
return function () {
alert(index);
return false;
}
}
}