黑马程序员技术交流社区
标题:
JS中如果出现了闭包怎么解决?
[打印本页]
作者:
Jam
时间:
2012-11-29 20:13
标题:
JS中如果出现了闭包怎么解决?
如题。JS中如果出现了闭包怎么解决?
作者:
许庭洲
时间:
2012-11-29 20:52
1. 在大中项目开发中,js 尽量使用闭包;
2. 由于变量名相同引起各种冲突,看着越来越多的js代码,想修改都没法修改。js闭包就是解决这个问题的很好的一个途径。
3. 不供外部调用的js代码可以使用匿名闭包,而其他的,尽量使用闭包名.
作者:
黑马_黄开潮
时间:
2012-11-30 23:39
本帖最后由 黑马_黄开潮 于 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>
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2