js闭包循环遍历监听_Js闭包

js闭包循环遍历监听_Js闭包JavaScript闭包之for循环

大家好,又见面了,我是你们的朋友全栈君。

之前讲了最简单的闭包,然而闭包最经典的是那个for循环,几乎每一个想要理解闭包的都会遇到这个例子,每一个讲解闭包的也会举这个例子。我这次不是要讲这么解决这个for循环闭包问题,而是解释这个闭包。

<ul>
    <li>0</li>
    <li>1</li>
    <li>2</li>
</ul>
<script>
    var liArr = document.getElementsByTagName("li");
    for(var i = 0; i < liArr.length; i++){
        liArr [i].onclick = function(){
            alert(i);
        }
    };
</script>
复制代码

我们预想的是点击哪个弹出哪个数,但实际上每一次弹出的i都是3。因为我们循环之后得到的是这样的:

liArr [0].click=function(){alert(i);};

liArr [1].click=function(){alert(i);};

liArr [2].click=function(){alert(i);};
复制代码

我们都知道GC机制了,i由于被函数引用,所以i不会被回收,那么i最后存储在内存中是3,当我们点击的时候从内存中获取的就是循环完了之后的3,所以每一次弹出来的都是3。

使用闭包解决,函数变成这样:

for(var i = 0; i < liArr .length; i++){
    liArr [i].onclick = (function(arg){
        return function () {
            alert(arg)
        }
    })(i)
};
复制代码

就是创建一个闭包,这个闭包是一个立即执行函数,然后返回一个函数。分析一下,当我们循环的时候,为每个li赋值了一个立即执行函数,返回了一个函数,形成了一个函数作用域,这时候相当于得到

liArr [0].onclick = function () {alert(arg) };

liArr [1].onclick = function () {alert(arg) };

liArr [2].onclick = function () {alert(arg) };
复制代码

之前我们说过,由于arg被全局函数引用,不会被GC回收,相当于内存中存放了每一个调用时候的arg值,也就是参数i的值,所以能弹出每个li对应的数。

对不是很理解的可以参考着看初识闭包的文章,你就很容易理解了。当然,对于解决这个问题还有很多方法,这边只是分析闭包的原理。

欢迎关注Coding个人笔记 公众号

转载于:https://juejin.im/post/5c4ed1eee51d454b0d75d768

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107037.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hostapd配置解析「建议收藏」

    hostapd配置解析「建议收藏」转载自:老丁的Linux:http://laoding.blog.51cto.com/980622/1697015hostapd的配置文件位于/etc/hostapd/hostapd.conf。interface=wlp2s0#bridge=br0driver=nl80211logger_syslog=-1logger_syslog_level=2logger_stdou…

    2022年5月21日
  • ccd视觉定位教程_CCD视觉定位识别系统,视觉系统ccd定位原理[通俗易懂]

    ccd视觉定位教程_CCD视觉定位识别系统,视觉系统ccd定位原理[通俗易懂]CCD机器视觉系统是用于工业检测及识别的高科技产品,生产的核心问题是工业计算机系统选型,可采集加工品的高清图像直接传输给到机子的GPIO接口。由于数字图像处理和计算机视觉技术的迅速发展,越来越多的研究者采用摄像机作为全自主用移动机器人的感知传感器。这主要是因为原来的超声或红外传感器感知信息量有限,鲁棒性差,而视觉系统则可以弥补这些缺点。而现实世界是三维的,而投射于摄像镜头(CCD/CMOS)上的图…

    2022年6月15日
  • pycharm注释的快捷键_pycharm注释比较多怎么办

    pycharm注释的快捷键_pycharm注释比较多怎么办用鼠标选中需要注释的代码,三次按下:shift+‘即可快速注释

    2022年8月28日
  • 使用libpng读写PNG图片

    使用libpng读写PNG图片libpng是一款C语言编写的比较底层的读写PNG文件的跨平台的库。借助它,你可以轻松读写PNG文件的每一行像素。因为PNG文件是经过压缩而且格式复杂的图形文件(有的PNG文件甚至像GIF文件一样带动画效果)而且PNG可以是带透明通道的真彩色图像、不带透明通道的真彩色图像、索引颜色、灰度颜色等各种格式,如果大家都自己写程序分析PNG文件就会显得很麻烦、很累。因此,通过使用libpng你就能直接…

    2022年10月22日
  • 爱发php企业发卡网源码_企业级发卡平台源码,界面友好,支付通道齐全,运营级发卡平台源码…

    爱发php企业发卡网源码_企业级发卡平台源码,界面友好,支付通道齐全,运营级发卡平台源码…企业级发卡平台源码,界面友好,支付通道齐全,运营级发卡平台源码PHP环境:php5.XMySQL环境:mysql5.6服务器需开启伪静态后台默认账号密码:配置说明:数据恢复文件目录\a8tgconfig\180626145246.sql或者通过客户端直接还原Back.psc数据库配置文件:\a8tgconfig\config.php修改相关数据库IP,账号,密码支付接口…

    2022年7月14日
  • navicat怎么连接sql_内镜连接时的注意事项

    navicat怎么连接sql_内镜连接时的注意事项使用Navicat连接SqlServer注意事项1.需要到Navicat安装目录下安装驱动2.端口连接时ip与端口号用“,”隔开

    2022年9月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号