闭包认知

132 阅读1分钟

// 闭包缺点

     //   返回函数  导致函数被引用

     //  函数被引用会导致  内存不释放 内存泄漏
     //   解决方式: 利用标记清除法:做到零引用,垃圾回收机制会自动回收
     //    赋值为  null   不占内存,会被自动回收

     //  优点 1.防止变量污染  2.函数内部变量可以被函数外部访问(形式上)
     
     
     //  MDN 闭包定义
    //  闭包指的是能被访问的自由变量的函数

    //  闭包两个条件   1.函数  2.存在自由变量被访问

    // 什么是自由变量?
    //  自由变量指的是: 在函数中使用,既不是函数的参数,也不是函数的局部变量的变量
    
    //   结论:  闭包由两部分组成
    //   闭包 =  函数 + 函数能够访问的自由变量

   
    function foo(){
        var count=0;
        return function(){
            console.log(++count);
        }
    }
    var res = foo();
    var res1 = foo()
    res();
    res1();
    // a变量被 foo 函数访问
    // a 既不是foo 的局部变量,也不是 foo 的参数
    //  所以 a是自由变量

    //  res 和 res1  是两个彼此独立的闭包,互不干扰
    
    
    使用立即执行函数
     //  没有函数提升
    (function(dec,go){
        console.log(window);
        //  使用全局作用域下的window
        console.log(go);
        //  使用当前作用域下,window,实现私有化
        console.log(dec);
        console.log('立即执行函数');
    }('我是实参',window))
    
    //  使用立即执行函数 解决闭包内存泄漏问题
    //  立即执行函数,在浏览器加载时候执行,执行时会创建变量
    //   并赋值,虽然res a b c 是闭包,执行完毕时变量会销毁
    //   res a b c 销毁 ,所以解决内存泄漏问题

    (function(global){
        var count = 0;
        function bar(){
            console.log(++count);
        }
        
    }(window))