首页 > 代码库 > javascirpt 闭包

javascirpt 闭包

前段时间看到一道面试题

<p>P1</p><p>P2</p><p>P3</p><p>P4</p><p>P5</p><p>P6</p>
<script>function clickP(){var a = document.getElementsByTagName("p");    for(var i=0;i<a.length;i++){            a[i].onclick = function(){                    alert(i);                };        }}clickP();</script>

点击所有P标签弹出提示都是6,如果改进clickP()使点击P提示对应的索引1、2、3....

因为click事件还没触发,循环已经完成,所以无论点哪个P都提示6

/*修改上述方法,点击p弹出对应序号        *创建闭包的一条原则就是:不要引用循环变量!        *如果一定要在闭包中引用循环变量怎么办???        *方法是再创建一个函数,将循环变量作为函数参数传入        */                        function clickP(){                var a = document.getElementsByTagName("p");                for(var i=0;i<a.length;i++){                            var fn = function(n){                                a[n].onclick = function(){                                    alert(n+1);                                }                                }                            fn(i);                    }            }                clickP();

 

javascirpt 闭包