美文网首页
浅谈javascript闭包概念及常见问题

浅谈javascript闭包概念及常见问题

作者: 是归人不是过客 | 来源:发表于2018-04-03 21:39 被阅读20次

    1,闭包:闭包是指有权访问另一个函数作用域的变量的函数。

    2,闭包的一般形式

    function f1(){

    function f2(){}

        return f2

    }

    3,举例

    例一,

    function f1(){

    var name="tom001",age=18,isgroup=false;

        function f2(){

    return "i am f2 function";

        }

    return f2;

    }

    //alert(f1());// function f2(){return "i am f2 function"; }

    // alert(f1().f2);//undefined

    //调用内部函数

    alert(f1()());//i am f2 function

    或者

    var ff=f1(); //ff=f2;

    ff();

    例二,

    function f1(){

    var name="tom001",age=18,isgroup=false;

    function f2(){

    return "i am f2 function-"+name;

    }

    return f2;

    }

    alert(f1()());//i am f2 function -tom001

    例三,

    function f1(){

    var age=18,isgroup=false;

      function f2(){

    var nn="tom001"

          return nn;

      }

    // console.log(f2());

      return f2;

      }

    //想得到nn值

      alert(f1()());  //tom001

    4,闭包例题

    例题一

    var arr=new Array();

    for(var i=0;i<5;i++){

    arr[i]=function () {

    alert(i);

    }

    }

    arr[0]();

    arr[1]();

    arr[2]();

    arr[3]();

    arr[4]();

    //5,5,5,5,5

    为什么不是1,2,3,4,5

    因为在完成循环后i的值已经是5了(for循环中的i是全局变量),调用arr[0](),arr[0](),arr[1]()......时会调用全局变量i,所以输出时会是5,5,5,5,5

    解决方法

    var arr=new Array();

    for(var i=0;i<5;i++){

    arr[i]=f1(i)

    }

    function f1(n){

           functionf2(){

             alert(n)

         }

        return  f2;

    }

    arr[0]();//f1()=f2;f1()=arr[];arr[]()=f1()()=f2();

    arr[1]();

    arr[2]();

    arr[3]();

    arr[4]();

    原因:i被传到f1()函数中时,这是的 i 即n已经不是全局变量了,而是在闭包环境下的i了。

    例题二

    document.body.innerHTML='<div id="div1">aaa</div>'

    +<div id=“div2”>bbb</div>+<div id="div3">ccc</div>

    for(var i=1;i<4;i++){

      docment.getElementById('div'+i).addEventListener('click',function(){

         alert(i);   //all are4

       })

    }

    解决方法

    for(var i=1;i<4;i++){

       !function(i){

            docment.getElementById('div'+i).addEventListener('click',function(){

              alert(i);   //all are4

          }

    }

    相关文章

      网友评论

          本文标题:浅谈javascript闭包概念及常见问题

          本文链接:https://www.haomeiwen.com/subject/dhgchftx.html