这一种的方式比起自执行方式的优点在什么地方?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <!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
收起
正在回答
2回答
同学你好!
它们没有什么区别,只是应用场景不同。
(1)类似这种(function(i){li[i].onclick=function(){alert(i);}})(i)是匿名函数,仅在调用时,才临时创建函数对象和作用域链对象、
这里并不是一个完全的闭包,但是它有闭包的特点,例如闭包结构事函数嵌套一个函数,这里也是通过自执行匿名函数函数嵌套一个点击事件的匿名函数。然后自执行的匿名函数形成了一个作用域,通过for循环出来的i值传递给绑定事件的li元素,每循环一次,也会在作用域中保存了当前的i值。所以实现了每次的i值都保存下来了。
(2)而同学写这个函数是一个闭包函数。本质上,闭包是将函数内部和函数外部连接起来的桥梁。它的优点1:变量长期驻扎在内存中;2:避免全局变量的污染; 3:私有成员的存在;
使用闭包要特别注意一点 :常驻内存 会增大内存的使用量 使用不当会造成内存泄露,由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
所以说应该根据引用场景去选择使用哪一种
如果帮助到了你 欢迎采纳 祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧