<script> var severalObj=window.document.getElementsByName("button"); for(var i=0;i<several.length.i++){ severalObj[i].onclick(){ alert(i); } } </script>
一般咱们在前端中要为若干个节点添加相同的事件,为了减小代码量便想出使用上面的代码对这些节点进行循环绑定事件。然而事情并未像以前预想到的那样,实验后会发现不管点击哪一个元素都会弹出several.length,而不是咱们以前预想的i。这正是闭包(匿名函数)要使用外部做用于中变量的结果。而却,这也是因为匿名函数自己没法传递参数(故没法维护本身的做用域)形成的。前端
当函数调用外部变量是就构成一个闭包,里面的变量会受到别的地方影响,因此解决的方式为:构建一个只有该匿名函数自己才能够访问的闭包,保存只供自己使用的变量。闭包
for(var i=0;i<severalObj.length;i++){ (function(i){ severalObj[i].onclick=function(){......} })(i); }
上面建立了匿名函数,从而构建了一个新的做用域。匿名函数须要传一个参数,因此在执行的时候须要传一个参数。也正是经过这个参数维护了中间状态。函数