您的位置:首页 > 其它

如何获取闭包中循环的i值

2016-05-20 13:10 253 查看
假设有这样的一个问题:ul中含有多个li标签,我们想对每个li绑定点击事件,并且打印出该li为第几个li元素

一般写法是写一个for循环

var lis = document.getElementsByTagName("li");
for (var i = 0; i < lis.length; i++) {
lis[i].onclick = function(){

console.log(arg);
};
}


但是,这样写之后我们发现,点击任何一个li,打印的值都为5,这是因为闭包中共用i值,而i的值由于执行for循环,都变为了5

为了正常显示i值,我们可以使用如下方法

//方法1:加一层闭包 将i值以参数形式传递给内层函数
for (var i = 0; i < lis.length; i++) {
(function(arg){
lis[i].onclick = function(){
console.log(arg);
};
})(i)
}

/*方法二:加一层闭包,i以局部变量形式传递给内层函数*/
for (var i = 0; i < lis.length; i++) {
(function(){
var temp = i;
lis[i].onclick = function(){
alert(temp);
}
})()
}

/*方法三:将i值作为对象的属性值*/
for (var i = 0; i < lis.length; i++) {
lis[i].i = i;
lis[i].onclick = function(){
console.log(this.i);
}
}

/*方法4:用function实现 实际上,没产生一个函数实例就会产生一个闭包*/
for (var i = 0; i < lis.length; i++) {
lis[i].onclick = new Function("console.log("+i+");")
}


参考文献:在循环中正确找到对应DOM元素的索引
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: