我们先看一个关于Javascript利用循环绑定事件的例子:
例如:一个不确定长度的列表,在鼠标经过某一条的时候改变背景。
?
XML/HTML代码
- <!DOCTYPE?html?PUBLIC?”-//W3C//DTD?XHTML?1.0?Transitional//EN”?”https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>??
- <html?xmlns=“https://www.w3.org/1999/xhtml”?>??
- <head>??
- ????<title>Untitled?Page</title>??
- </head>??
- <body>??
- <ul?id=“list”>??
- <li>第1条记录</li>??
- <li>第2条记录</li>??
- <li>第3条记录</li>??
- <li>第4条记录</li>??
- <li>第5条记录</li>??
- <li>第6条记录</li>??
- </ul>??
- <script?type=“text/javascript”>??
- ????var?list_obj?=?document.getElementById(“list”).getElementsByTagName(“li”);?//获取list下面的所有li的对象数组 ??
- ????for?(var?i?=?0;?i?<=?list_obj.length;?i++)?{ ??
- ????????list_obj[i].onmousemove?=?function()?{ ??
- ????????????this.style.backgroundColor?=?“#cdcdcd”; ??
- ????????} ??
- ????????list_obj[i].onmouseout?=?function()?{ ??
- ????????this.style.backgroundColor?=?“#FFFFFF”; ??
- ????????} ??
- ????} ??
- </script>??
- </body>??
- </html>??
这个例子循环为一组对象绑定事件处理函数。
但是,如果我们在这个基础上增加一些需求。比如在点击某一条记录的时候弹出这是第几条记录?
肯能你会理所当然的这么写:
?
XML/HTML代码
- <!DOCTYPE?html?PUBLIC?”-//W3C//DTD?XHTML?1.0?Transitional//EN”?”https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>??
- <html?xmlns=“https://www.w3.org/1999/xhtml”?>??
- <head>??
- ????<title>Untitled?Page</title>??
- </head>??
- <body>??
- <ul?id=“list”>??
- <li>第1条记录</li>??
- <li>第2条记录</li>??
- <li>第3条记录</li>??
- <li>第4条记录</li>??
- <li>第5条记录</li>??
- <li>第6条记录</li>??
- </ul>??
- <script?type=“text/javascript”>??
- ????var?list_obj?=?document.getElementById(“list”).getElementsByTagName(“li”);?//获取list下面的所有li的对象数组 ??
- ????for?(var?i?=?0;?i?<=?list_obj.length;?i++)?{ ??
- ????????list_obj[i].onmousemove?=?function()?{ ??
- ????????????this.style.backgroundColor?=?“#cdcdcd”; ??
- ????????} ??
- ????????list_obj[i].onmouseout?=?function()?{ ??
- ????????????this.style.backgroundColor?=?“#FFFFFF”; ??
- ????????} ??
- ????????list_obj[i].onclick?=?function()?{ ??
- ????????????alert(“这是第”?+?i +?”记录”); ??
- ????????} ??
- ????} ??
- </script>??
- </body>??
- </html>??
测试一下你会发现alert出来的都是:这是第6记录
其实这里for循环已将整个列表循环了一遍,并执行了i++,所以这里i变成了6,
有什么好的办法解决这个问题吗?
那就是闭包了,个人认为闭包是js中最难捉摸的地方之一,
看看什么是闭包:
闭包时是指内层的函数可以引用存在与包围他的函数内的变量,即使外层的函数的执行已经终止。
可以查阅:https://www.7psus5.com/article.asp?id=469
这个例子中我们可以这样做:
?
XML/HTML代码
- <!DOCTYPE?html?PUBLIC?”-//W3C//DTD?XHTML?1.0?Transitional//EN”?”https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>??
- <html?xmlns=“https://www.w3.org/1999/xhtml”?>??
- <head>??
- ????<title>Untitled?Page</title>??
- </head>??
- <body>??
- <ul?id=“list”>??
- <li>第1条记录</li>??
- <li>第2条记录</li>??
- <li>第3条记录</li>??
- <li>第4条记录</li>??
- <li>第5条记录</li>??
- <li>第6条记录</li>??
- </ul>??
- <script?type=“text/javascript”>??
- ????function?tt(nob)?{ ??
- ????????this.clickFunc?=?function()?{ ??
- ????????alert(“这是第”?+?(nob?+?1)?+?”记录”); ??
- ????????} ??
- ????} ??
- ????var?list_obj?=?document.getElementById(“list”).getElementsByTagName(“li”);?//获取list下面的所有li的对象数组 ??
- ????for?(var?i?=?0;?i?<=?list_obj.length;?i++)?{ ??
- ????????list_obj[i].onmousemove?=?function()?{ ??
- ????????????this.style.backgroundColor?=?“#cdcdcd”; ??
- ????????} ??
- ????????list_obj[i].onmouseout?=?function()?{ ??
- ????????????this.style.backgroundColor?=?“#FFFFFF”; ??
- ????????} ??
- ????????var?col?=?new?tt(i); ??
- ????????list_obj[i].onclick?=?col.clickFunc; ??
- ????} ??
- </script>??
- </body>??
- </html>??
大家可以看看:Javascript循环绑定事件(续)https://www.7psus5.com/article.asp?id=535
PS:闭包很难,很复杂!
最新评论
写的挺好的
有没有兴趣翻译 impatient js? https://exploringjs.com/impatient-js/index.html
Flexbox playground is so great!
感谢总结。
awesome!
这个好像很早就看到类似的文章了
比其他的教程好太多了
柯理化讲的好模糊…没懂