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


相关推荐

  • python ip池(python 连接池)

    ,都说标题是文章的灵魂,想了半天没想到什么比较有创意的标题,只好拿一个去年的爆款标题套一下。啊哈哈哈哈哈哈,朕真是太机智了这是一篇介绍如何使用python搭建IP池的文章,如果爱卿对此不感兴趣,那很抱歉,标题耽误了你宝贵的时间。事情的起因是这样,前段时间我写了一篇介绍如何爬取小说的blog【python那些事.No2】,在爬取的过程中,发现同一个IP连续只能获取前几页小说内容,原本是想搭建…

    2022年4月11日
    37
  • 是否可以将频谱分析仪当做网络分析仪使用?[通俗易懂]

    是否可以将频谱分析仪当做网络分析仪使用?[通俗易懂]PSD测量值通常以Vrms2/Hz或Vrms/rtHz为单位(这里的rtHz指的是平方根赫兹)。或者,PSD也可以采用dBm/Hz为单位。PSA、ESA、856XE/EC或859XE等频谱分析仪均可通过噪声标记对功率谱密度进行测量。矢量信号分析仪比如89600S或89400,直接就有PSD测量数据类型。 在频谱分析仪上最简便的测量方法(测量结果以Vrms/rtHz为单位)就是: 在振幅菜单中选择以伏特为单位的振幅(AMPLITUDE[硬键]>More>YAxis

    2022年8月11日
    4
  • Python元组_python元组的定义方式

    Python元组_python元组的定义方式元组元组的特点:是一种不可变序列,一旦创建就不能修改拆包将元组的元素取出赋值给不同变量>>>a=('hello','world',1

    2022年7月28日
    4
  • 哈希冲突原因「建议收藏」

    哈希冲突原因「建议收藏」哈希计算就是努力的把比较大的数据存放到相对较小的空间中。最常见的哈希算法是取模法。下面简单讲讲取模法的计算过程。比如:数组的长度是5。这时有一个数据是6。那么如何把这个6存放到长度只有5的数组中呢。按照取模法,计算6%5,结果是1,那么就把6放到数组下标是1的位置。那么,7就应该放到2这个位置。到此位置,哈斯冲突还没有出现。这时,有个数据是11,按照取模法,11%5=1,也等于1。那

    2022年6月18日
    35
  • html制作网页案例代码 大学生_完整html网页代码

    html制作网页案例代码 大学生_完整html网页代码+前言完成一个网页的制作其实本质上是很简单的,本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,采用了有div+css布局。+主题《登录·枫叶》+图摘+目录+代码

    2022年9月23日
    0
  • 多行注释快捷键_jsp注释快捷键

    多行注释快捷键_jsp注释快捷键1、Pycharm同时编辑多行:alt+shift+ctral+鼠标左键2、Pycharm同时多行注释:多行选中后ctrl+\

    2022年8月28日
    3

发表回复

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

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