这一种的方式比起自执行方式的优点在什么地方?

这一种的方式比起自执行方式的优点在什么地方?

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>2-1</title>
    <style>
        /*补充代码*/
        li{cursor:pointer;}
    </style>
</head>
<body>
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <script>
        var li=document.getElementsByTagName("li");
        for(var i=0,len=li.length;i<len;i++){
            li[i].onclick = (function (j) {
            return function () {
                alert('这是第' + (j+1)+ '个li');
            }
        })(i);
        }
    </script>
</body>
</html>


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好!

它们没有什么区别,只是应用场景不同。

(1)类似这种(function(i){li[i].onclick=function(){alert(i);}})(i)是匿名函数,仅在调用时,才临时创建函数对象和作用域链对象、

这里并不是一个完全的闭包,但是它有闭包的特点,例如闭包结构事函数嵌套一个函数,这里也是通过自执行匿名函数函数嵌套一个点击事件的匿名函数。然后自执行的匿名函数形成了一个作用域,通过for循环出来的i值传递给绑定事件的li元素,每循环一次,也会在作用域中保存了当前的i值。所以实现了每次的i值都保存下来了。

(2)而同学写这个函数是一个闭包函数。本质上,闭包是将函数内部和函数外部连接起来的桥梁。它的优点1:变量长期驻扎在内存中;2:避免全局变量的污染; 3:私有成员的存在;

使用闭包要特别注意一点 :常驻内存 会增大内存的使用量 使用不当会造成内存泄露,由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。

所以说应该根据引用场景去选择使用哪一种

如果帮助到了你 欢迎采纳 祝学习愉快~

  • Elvis_T 提问者 #1
    虽然还想知道 1.第一种方式虽然有闭包特征,但会不会也造成内存泄露, 2.如果将函数赋值为null的话可不可以让垃圾回收机制进行回收,如果可以怎么赋值,如果不行怎么解决内存泄露的问题, 3.可不可以有一种即可以用闭包的形式来完成对应,又可以在完成以后在进行释放内存? 还是非常感谢老师的认真解惑!! 问题有点儿多,不过也是自己的疑惑吧
    2019-06-18 14:03:23
  • 好帮手慕码 回复 提问者 Elvis_T #2
    同学你好! 1. 闭包都会导致变量无法释放,两种写法方式其实无差别,而且js有自动垃圾回收机制,基本不会存在内存泄露 2. 解决内存泄漏的时候可以将函数赋值为null,但是本例中只要dom一直存在,就需要点击执行函数,如果赋值为null可以释放内存,但是点击函数怎么办?这里不适用 3. 使用闭包就是为了保存一些变量等,所以闭包肯定要占内存的。所以建议同学还是在使用完之后,把变量设置为null, 让变量失去引用,会被系统自动回收。 祝学习愉快~
    2019-06-18 16:19:44
好帮手慕码 2019-06-18 12:10:42

同学你好!
其实它们是一样的,都是在点击的时候执行函数。

如果帮助到了你 欢迎采纳 祝学习愉快~

  • 提问者 Elvis_T #1
    我知道效果是一样的,我是想问,在工作中那种更优雅,可维护性,性能啊什么的有什么区别
    2019-06-18 12:13:10
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.组件化网页开发
  • 参与学习           人
  • 提交作业       1121    份
  • 解答问题       14456    个

本阶段在运用JS实现动态网页开发的基础上,带你深入理解企业开发核心思想,完成一个企业级网页的开发,体验前端工程师的成就感。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师