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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea部署tomcat启动浏览器显示404_idea自带tomcat怎么用

    idea部署tomcat启动浏览器显示404_idea自带tomcat怎么用这个方法只限于解决原来可以访问jsp,但是后来突然访问不了。并且非常的简单粗暴。请移步:(声明:这不是我的文章)https://blog.csdn.net/wt520it/article/details/88126654

    2025年11月10日
    8
  • Python求一元二次方程解「建议收藏」

    Python求一元二次方程解「建议收藏」题目:请定义一个函数’quadratic(a,b,c)‘,接收三个参数,返回一元二次方程:ax²+bx+c=0的两个解。(提示:计算平方根可以调用math.sqrt()函

    2022年7月6日
    28
  • 【cocos2d-js官方文档】十、log「建议收藏」

    【cocos2d-js官方文档】十、log

    2022年1月20日
    54
  • 百度搜索引擎中的快照及快照更新机制「建议收藏」

    百度搜索引擎中的快照及快照更新机制「建议收藏」百度搜索引擎中的快照及快照更新机制   1、什么是百度快照?  如果无法打开某个搜索结果,或者打开速度特别慢,该怎么办?“百度快照”能帮您解决问题。每个被收录的网页,在百度上都存有一个纯文本的备份,称为“百度快照”。百度速度较快,您可以通过“快照”快速浏览页面内容。不过,百度只保留文本内容,所以,那些图片、音乐等非文本信息,快照页面还是直接从原网页调用。如果您无法连接原网页,那么…

    2022年9月28日
    3
  • scrapy框架入门实例_jeecg框架入门

    scrapy框架入门实例_jeecg框架入门一、概述Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试.其最初是为了页面抓取(更确切来说,网络抓取)所设计的,后台也应用在获取API所返回的数据(例如AmazonAssociatesWebServices)或者通用的网络爬虫.Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseS

    2022年8月30日
    2
  • webrtc开发入门_统计的简单应用

    webrtc开发入门_统计的简单应用WebRTC介绍及简单应用WebRTC,即WebRealTimeCommunication,web实时通信技术。简单地说就是在web浏览器里面引入实时通信,包括音视频通话等。WebRT

    2022年8月1日
    5

发表回复

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

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