闭包

作者: Lucien_d70a | 来源:发表于2017-10-12 23:06 被阅读0次

    什么是闭包?

    • 可以访问函数内部变量的函数
    //首先我们要明白这段代码
    //外面的a是跟函数作用域里边的a是不同的
    //num(a)只是把外面的a的值赋值给函数里面的a
    //函数里面声明的东西跟外面的一点关系都没有。
    
    var a=99
    function num(a){
        ++a
        console.log(a)
    }
    num(a)//100
    console.log(a)//99
    
    var arr=[];
        for(var i=0;i<2;i++){
            arr[i]=function(){
                console.log(i)
            }
        }
    arr[1]()//都是会打印出2
    arr[0]()//2
    
    //首先明白function()里面的东西是什么时候会执行。
    //实在函数被调用的时候才会执行,上面代码在函数执行的时候,已经遍历完毕,i==5,所以,每次打印的都是5
    

    改装下

    var arr=[];
    for(var i=0;i<2;i++){
        function num(i){
            arr[i]=function(){
                console.log(i)
            }
        }
        num(i)
    }
    arr[0]()//0
    arr[1]()//1
    
    上面的代码可以拆分为
    当i=0的时候:
    function num(i){
            //i=0 写在形参的I其实就是在函数内部声明了一个变量==var i
            arr[0]=function(){
            console.log(0) //我获取的是函数里面的i
        }
    }
    num(0)
    //参考例子1,我们是吧遍历的i的值赋给了函数里面的i,
    //那么我们外面的调用arr[0]()的时候,
    自然里面的就会按照函数的作用域,
    上去找i打印,
    找到的是num函数里面的i,
    所以就打印出0;
    
    
    如此类推
    当i=1时:
    function num(i){
            //i=0 写在形参的I其实就是在函数内部声明了一个变量==var i
            arr[1]=function(){
            console.log(1) //我获取的是函数里面的i
        }
    }
    num(1)
    
    最后可以改为:
        var arr=[];
        for(var i=0;i<2;i++){
            !function (i){
                arr[i]=function(){
                    console.log(i)
                }
            }(i)
        }
        arr[0]()
        arr[1]()
    
    

    第二种方法

    var arr=[];
        for(var i=0;i<2;i++){
            arr[i]=function(i){
                return function (){
                    console.log(i)
                }
            }(i)
        }
        arr[0]()//0
        arr[1]()//1
    
    //拆一下 也可以写为:
    var arr=[];
        for(var i=0;i<2;i++){
            arr[i]=fn(i)
            function fn(i){
                return function (){
                    console.log(i)
                }
            }
        }
        arr[0]()//0
        arr[1]()//1
    

    闭包说明很多道理,更重要的是理解好函数的作用域问题。。

    相关文章

      网友评论

          本文标题:闭包

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