首页 / JAVA / javascript闭包的一个例子
javascript闭包的一个例子
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript闭包的一个例子,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2723字,纯文字阅读大概需要4分钟。
内容图文
< html > < head > < title >elementFromPoint</title><script type="text/javascript"> window.onload =function(){ for(var i=0; i<6; i++){ var alink = document.createElement(‘a‘); var titleText = document.createTextNode(‘‘+ (i+1) +‘‘); alink.appendChild(titleText); alink.href ="javascript:void(0)"; alink.onclick =function(){alert(i)}; var div = document.getElementById(‘show-detail‘); div.appendChild(alink); } } </script></head><body><div id="show-detail"></div></body></html>
这是一组link,你会发现点击任何一个link,结果总是6。为什么?
解释:这是因为这6个link每次单击时,都会触发函数:function(){alert(i)};,这个函数的作用就是打印当前的i值,而添加完6个link标签后,内存中的i值已经变成了6,因此单击任何一个link,都会弹出6。
而我们的本意是想单击任何link时,都会弹出对应的数字,这该怎么解决?解决方法就是javascript的闭包特性
闭包--------------------------------------------------------------------------------------------------------------------------------------------
关于闭包,可以看以下网址:
http://www.jb51.net/article/24101.htm
闭包简单的说,就是当函数a的内部函数b被函数a外的一个变量C引用的时候,就创建了一个闭包。闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。例子如下:
function a(name) { var num=0; function b() { alert("name:"+name+";num:"+num); num++; } return b; } var c = a("c"); var d = a("d"); c(); //name:c;num:0 d(); //name:d;num:0 c(); //name:c;num:1 d(); //name:d;num:1
由于闭包特性,a一直存在于内存中,每一次运行c()或者d(),c和d对应的a对象都会num++。关于这一部分有一个作用域链的概念,不清楚的可以自己查查。
例子修改------------------------------------------------------------------------------------------------------------------------------------------
因此,对于上面的例子,我们可以修改如下:
< html > < head > < title >elementFromPoint</title><script type="text/javascript"> window.onload =function(){ for(var i=0; i<6; i++){ var alink = document.createElement(‘a‘); var titleText = document.createTextNode(‘‘+ (i+1) +‘‘); alink.appendChild(titleText); alink.href ="javascript:void(0)"; alink.onclick= showI(i); var div = document.getElementById(‘show-detail‘); div.appendChild(alink); } } function showI(i) { var num=0; var a=function(){alert("i:"+i+";num:"+num++);} return a; } </script></head><body><div id="show-detail"></div></body></html>
修改后可以看到,点击每一个link,都可以弹出对应的编号
alink.onclick= showI(i); alink.onclick指向函数showI中的内部对象a,因此showI对象不会被GC回收,每一个alink对应一个showI对象,单击每一个alink时,会触发各自对应的showI对象;代码中生成了6个alink,同时为这6个alink分别分配了6个“闭包函数”showI(i),每一个闭包函数保存了alink对应的编号i。由于闭包特性,这6个showI对象不会被释放,一致存放于内存中,因此6个link分别单击时,会弹出相应的编号。
function showI(i)
{
var num=0; //这里加一个num,说明每一个link单击时,num++不会相互影响
var a= function(){alert("i:"+i+";num:"+num++);}
return a;
}
本文例子取自 http://blog.csdn.net/xiaohai0504/article/details/7735971
原文:http://www.cnblogs.com/king1302217/p/3806440.html
内容总结
以上是互联网集市为您收集整理的javascript闭包的一个例子全部内容,希望文章能够帮你解决javascript闭包的一个例子所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。