以上场景是初学者经常碰到的。即获取HTML元素集合,循环给元素添加事件。在事件响应函数中(event handler)获取对应的索引。但每次获取的都是最后一次循环的索引。
原因是初学者并未理解JavaScript的闭包特性。通过element.onclick=function(){alert(i);}方式给元素添加点击事件。响应函数function(){alert(i);}中的 i 并非每次循环时对应的 i(如0,1,2,3,4)而是循环后最后 i 的值5。 或者说循环时响应函数内并未能保存对应的值 i,而是最后一次i++的值5。
function init1() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
pAry[i].i = i;
pAry[i].onclick = function() {
alert(this.i);
}
}
}
function init2() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
(pAry[i].onclick = function() {
alert(arguments.callee.i);
}).i = i;
}
}
function init3() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
(function(arg){
pAry[i].onclick = function() {
alert(arg);
};
})(i);//调用时参数
}
}
function init4() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
(function () {
var temp = i;//调用时局部变量
pAry[i].onclick = function() {
alert(temp);
}
})();
}
}
function init5() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
pAry[i].onclick = function(arg) {
return function() {//返回一个函数
alert(arg);
}
}(i);
}
}
function init6() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例
}
}
function init7() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
pAry[i].onclick = Function('alert('+i+')');
}
}