六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 143|回复: 0

js闭包浅谈

[复制链接]

升级  39.33%

31

主题

31

主题

31

主题

秀才

Rank: 2

积分
109
 楼主| 发表于 2013-1-29 08:47:24 | 显示全部楼层 |阅读模式
<html><head></head><body><input type="button" value="button1"/><input type="button" value="button2"/><input type="button" value="button3"/><input type="button" value="button4"/><input type="button" value="button5"/><script type="text/javascript">var x = document.getElementsByTagName("input");function add_event_handlers(nodes){//外部函数var i;for(i = 0; i<nodes.length;i+=1){nodes[i].onclick = function(e){ //内部函数alert(i);}}}add_event_handlers(x);</script><p>我们想要button提示出它的序号。但是结果却不尽如人意。</p><p>为什么点击每个button的时候都是弹出来5,而不是我们想要的button的序列呢,究其原因是alert(i)中调用了i,这个i是在这个函数的外部的,  ,当我们在外部函数(add_event_handlers)的外面调用了内部函数,从而产生了闭包。  闭包允许你引用存在于外部函数中的变量。然而,它并不是使用该变量创建时的值,相反,它使用外部函数中该变量最后的值。  也就是说,内部函数传递的参数i并不是单纯的值,传的是一个引用,也就是实实在在的i,当然取到的是最后的值。</p><p>  那我们应该实现我们的目的呢,学过c语言的都知道,传值和传址(传的引用)。我们这里可以把内部函数改成立即执行。  这时候取到的就是我们想要的i了。 </p> <pre>  function add_event_handlers(nodes){//外部函数var i;for(i = 0; i<nodes.length;i+=1){nodes[i].onclick = function(i){ //内部函数return function(e){alert(i);  }}(i);}}</pre></body></html>
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表