javascript for循环中的闭包

<a href="#">link1</a> <a href="#">link2</a> <a href="#">link3</a>
<script>

function main(links) {
for (var i=0; i<links.length; i++) {
links[i].onclick = function() {
alert(i+1);
   }
 }
};
main(document.getElementsByTagName("a"));

</script>

注意我们的links.length为3;0 1 2

可是实际运行时点击任何一个链接都是 4.

为什么?

为当闭包函数被调用时,他引用的是最后一次的赋值

解决办法:

 links[i].onclick=(function(j){
     return function(){
         alert(j+1);
     }
 })(i);
 
 }

用一个匿名函数来激发作用域:

 (function(){ 
var tmp=i; links[i].onclick
=function(){ alert(tmp+1); }; })();

还有很多的解决办法:

http://www.cnblogs.com/snandy/archive/2011/03/01/1967628.html

lua中for循环 绑定事件也有这个问题。

 for i=1,,100 do 

  btn :addEventListenr(function()

    console.log(i);

  end)

打印的i也是最后一个值。

原文地址:https://www.cnblogs.com/youxin/p/2697432.html