zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    第二十一章 PHP编译安装(centos7)
    第二十章 nginx常见问题
    第十九章 keepalived高可用
    dijkstra
    求逆序对
    A
    P2014 [CTSC1997]选课
    樱花 混合背包
    1401D
    CF1343D
  • 原文地址:https://www.cnblogs.com/miharu/p/4173301.html
Copyright © 2011-2022 走看看