A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Jam

中级黑马

  • 黑马币:0

  • 帖子:18

  • 精华:0

© Jam 中级黑马   /  2012-11-29 20:13  /  1320 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如题。JS中如果出现了闭包怎么解决?

2 个回复

倒序浏览
1. 在大中项目开发中,js 尽量使用闭包;
2. 由于变量名相同引起各种冲突,看着越来越多的js代码,想修改都没法修改。js闭包就是解决这个问题的很好的一个途径。
3. 不供外部调用的js代码可以使用匿名闭包,而其他的,尽量使用闭包名.
回复 使用道具 举报
本帖最后由 黑马_黄开潮 于 2012-11-30 23:41 编辑

04.<mce:script type="text/javascript"><!--  
05.function $(elem){  
06.return document.getElementById(elem);  
07.}  
08.function tag(name,elem)  
09.{  
10.    return (elem||document).getElementsByTagName(name);  
11.}  
12.  
13.function init()  
14.{  
15.    var div=tag("div");  
16.    for(var i=0;i<div.length;i++)  
17.    {  
18.        div.onclick=function()  
19.        {  
20.            alert(i);  
21.        }  
22.    }  
23.}  
24.--></mce:script>
上段代码本意是在每个div上都加一个事件,即每当点击div时,就显示此div的相应序号。但是运行程序时我们会发现,不论点击那个,只会显示7,这是什么愿因呢。--这就是闭包的问题
在js中,函数中在定义函数,就出现闭包了。此时外层函数中变量是可以在里层函数里利用的,即使外层函数结束。但是当外层中出现循环的时候,如果在里层函数中利用这个循环变量的话,会直接引用这个变量的最终值。
就像上述代码演示的一样。
解决:
可以利用匿名函数来加以解决。匿名函数会制动执行,我们可以利用这一特性,来产生一个作用域,生命一个变量,来引用外层的循环变量。
04.<mce:script type="text/javascript"><!--  
05.function $(elem){  
06.return document.getElementById(elem);  
07.}  
08.function tag(name,elem)  
09.{  
10.    return (elem||document).getElementsByTagName(name);  
11.}  
12.  
13.function init()  
14.{  
15.    var div=tag("div");  
16.    for(var i=0;i<div.length;i++){  
17.    (function(){  
18.    var temp=i;  
19.     div[temp].onclick=function()  
20.        {  
21.            alert(temp);  
22.        }  
23.      
24.      
25.    })()  
26.      
27.  }      
28.}  
29. --></mce:script>
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马