如何获取闭包中循环的i值
2016-05-20 13:10
253 查看
假设有这样的一个问题:ul中含有多个li标签,我们想对每个li绑定点击事件,并且打印出该li为第几个li元素
一般写法是写一个for循环
但是,这样写之后我们发现,点击任何一个li,打印的值都为5,这是因为闭包中共用i值,而i的值由于执行for循环,都变为了5
为了正常显示i值,我们可以使用如下方法
参考文献:在循环中正确找到对应DOM元素的索引
一般写法是写一个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元素的索引
相关文章推荐
- 项目 Web 的 NuGet 程序包还原失败: 找不到“1.0.0”版本的程序包“Microsoft.Net.Compilers”。。 0
- struts2中的几个技术
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
- 工作总结与感悟
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
- C++生成n个指定1到 n 不同的随机数
- STM32F4时钟设置分析
- ⻦哥的LINUX私房菜 学习
- 【Linux】 find指令(文件查找)
- caffe层解读系列-softmax_loss
- spring boot集成data-jpa
- 【转载】最动听的发烧好歌辑《爱上草原爱上你》30首
- USB总线驱动程序
- 使用新的 apt 命令在 Ubuntu 16.04 LTS 下管理软件包
- 蓝牙学习1
- android 日常迭代与维护总结一
- imx6 hdmi接口支持
- yii excel上传验证
- 查看mysql数据库和表所占用空间
- FineUI(专业版)v3.1发布(ASP.NET控件库)!